博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

优雅的knockout.js + JQuery

Posted on 2012-09-29 10:51  Leon zhang  阅读(4319)  评论(2编辑  收藏  举报

前段时间安装了VS2012的旗舰版,发现在自动创建的项目中自带了一个knockout.js的文件,Google之后发现这是一个js类库,而且非常好用。特别是结合JQuery来做一些数据绑定列表,和实现一些无刷新操作的时候非常简单。在官网上学习了下,并且依样画芦的做了几个demo,下面抽出其中一个最常用的例子和大家分享。

 

 先看下效果图:

 

 

具体代码实现: 

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <base href="http://learn.knockoutjs.com/" />
 5     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
 6     <script type='text/javascript' src='/Scripts/Lib/knockout-2.1.0.js'></script>
 7     
 8     <script type='text/javascript' src='/scripts/lib/sammy.js'></script>
 9     
10     <link rel="Stylesheet" href="/Content/App/coderunner.css" />
11     <link rel="Stylesheet" href="/Content/TutorialSpecific/webmail.css" />
12 </head>
13 <body>
14 <ul class="folders" data-bind="foreach: folders"><!-- 循环遍历viewModel中的数据 -->
15     <li data-bind="text: $data, 
16                css: { selected: $data == $root.chosenFolderId() },
17                click: $root.goToFolder"></li><!-- text: $data 获取数据的值  } -->
18 </ul>
19 
20 <table class="mails" data-bind="with: chosenFolderData"><!-- 验证数据源是否为null -->
21     <thead><tr><th>From</th><th>To</th><th>Subject</th><th>Date</th></tr></thead>
22     <tbody data-bind="foreach: mails"><!-- 循环遍历一个从后台返回的IEnumerable<mails>的json数据 -->
23         <tr data-bind="click: $root.goToMail"><!-- 调用函数 -->
24             <td data-bind="text: from"></td><!-- 具体数据内容 -->
25             <td data-bind="text: to"></td>
26             <td data-bind="text: subject"></td>
27             <td data-bind="text: date"></td>
28         </tr>     
29     </tbody>
30 </table>
31 
32 <div class="viewMail" data-bind="with: chosenMailData"><!-- 验证数据源是否为null -->
33     <div class="mailInfo">
34         <h1 data-bind="text: subject"></h1><!-- 具体数据内容 -->
35         <p><label>From</label><span data-bind="text: from"></span></p>
36         <p><label>To</label><span data-bind="text: to"></span></p>
37         <p><label>Date</label><span data-bind="text: date"></span></p>
38     </div>
39     <class="message" data-bind="html: messageContent" />
40 </div>
41    
42     <script type="text/javascript">
43             function WebmailViewModel() {
44     // Data
45     var self = this;
46     self.folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
47     self.chosenFolderId = ko.observable();//监控id
48     self.chosenFolderData = ko.observable();//监控数据列表
49     self.chosenMailData = ko.observable();//监控详情数据
50     
51     /*self.goToFolder = function(folder) { 
52          self.chosenFolderId(folder); 
53          self.chosenMailData(null); // Stop showing a mail
54          $.get('/mail', { folder: folder }, self.chosenFolderData);//self.chosenFolderData这一步其实就是获得数据(简写的方式)
55          };
56          
57     self.goToMail = function(mail) { 
58         self.chosenFolderId(mail.folder);
59         self.chosenFolderData(null); // Stop showing a folder
60         $.get("/mail", { mailId: mail.id }, self.chosenMailData);
61     };*/
62     
63     self.goToFolder = function(folder) { location.hash = folder };//location.hash可以用来获取或设置页面的标签值,在地址栏里显示出路径
64     self.goToMail = function(mail) { location.hash = mail.folder + '/' + mail.id };
65      
66     Sammy(function() {
67         this.get('#:folder', function() {
68             self.chosenFolderId(this.params.folder);
69             self.chosenMailData(null);
70             $.get("/mail", { folder: this.params.folder }, self.chosenFolderData);
71         });
72 
73         this.get('#:folder/:mailId', function() {
74             self.chosenFolderId(this.params.folder);
75             self.chosenFolderData(null);
76             $.get("/mail", { mailId: this.params.mailId }, self.chosenMailData);
77         });
78         
79         this.get('', function() { this.app.runRoute('get', '#Inbox') });
80     }).run();
81     
82     self.goToFolder('Inbox');
83 };
84 
85 ko.applyBindings(new WebmailViewModel());
86     </script>
87 </body>
88 </html>


Demo:Knockout.js完整实例