實時反映物件屬性的變化
在前一篇部落格中我們使用瞭如下程式碼去新增user物件,即push方法:
$("#btnAddUser").click(function () { vm.users.push(new UserViewModel( $("#u_id").val(), $("#u_name").val(), parseInt($("#u_score").val()))); });
使用 ko.computed去動態的計算user物件的socre屬性的總和,前面有朋友問到修改之類的問題,我們嘗試著新增一個按鈕利用下面的程式碼試試:
$("#btnUpdateScore").click(function () { vm.users()[0].score = 125; });
我們發現絲毫沒有反應,其實就是我們想當然的認為使用了 ko.observableArray()就可以自動檢測屬性,其實他只是監控物件,而不是物件中的屬性,因此,要讓物件的屬性也成為監控屬性的話,我們就要回過頭來使用ko.observable(),只要稍微已修改裡面就OK了:
function UserViewModel(id, name, score) { var self = this; self.id = id; self.name = ko.observable(name); //改為observalbe self.score = ko.observable(score); } $("#
btnUpdateScore
").click(function () { //設定內容 vm.users()[0].score(125).name("HelloWorld!"); });
我們來修改新增物件的score和name來看看效果如何:
完整程式碼如下:
1 <!DOCTYPE html> 2 3 <html> 4 <head> 5 <meta name="viewport" content="width=device-width" /> 6 <title>Index2</title> 7 <script src="~/Scripts/jquery-2.0.3.js"></script> 8 <script src="~/Scripts/knockout-2.3.0.js"></script> 9 <script type="text/javascript"> 10 //定義user資料物件 11 function UserViewModel(id,name,score) { 12 var self = this; 13 self.id = id; 14 self.name =ko.observable(name); 15 self.score =ko.observable(score); 16 } 17 //定義ViewModel 18 function ViewModel() { 19 var self = this; 20 self.users = ko.observableArray();//新增動態監視陣列物件 21 self.removeUser = function (user) { 22 self.users.remove(user); 23 } 24 self.totalscore = ko.computed(function () { 25 var total = 0; 26 $.each(self.users(), function (i, u) { 27 total += u.score(); 28 }) 29 return total; 30 }); 31 }; 32 $(function () { 33 var vm = new ViewModel(); 34 //預先新增一些資料 35 vm.users.push(new UserViewModel("d1", "rohelm", 121)); 36 vm.users.push(new UserViewModel("d2", "halower", 125)); 37 $("#btnAddUser").click(function () { 38 vm.users.push(new UserViewModel( 39 $("#u_id").val(), 40 $("#u_name").val(), 41 parseInt($("#u_score").val()))); 42 }); 43 $("#btnUpdateScore").click(function () { 44 vm.users()[vm.users().length-1].score(125).name("HelloWorld!"); 45 }); 46 ko.applyBindings(vm); 47 }); 48 </script> 49 </head> 50 <body> 51 <section style="margin:250px"> 52 <section> 53 ID<input type="text" id="u_id" style="width:30px"> 54 Name<input type="text" id="u_name" style="width:30px"> 55 Score<input type="text" id="u_score" style="width:30px"><br/> 56 <input value="Add" id="btnAddUser" type="button" style="width:200px; background-color:#ff6a00;"/><br/> 57 共 <span data-bind="text: users().length"></span> 條--------------合計 <span data-bind="text: totalscore"></span> 分 58 </section> 59 <section> 60 <table> 61 <thead> 62 <tr><th>ID</th><th>Name</th><th>Score </th><th>Option</th></tr> 63 </thead> 64 <tbody data-bind="foreach: users"> 65 <tr> 66 <td><span data-bind="text: id"></span></td> 67 <td><span data-bind="text: name"></span></td> 68 <td><span data-bind="text: score"></span></td> 69 <td><a href='#' data-bind="click: $root.removeUser">Remove</a></td> 70 </tr> 71 </tbody> 72 </table> 73 <input value="Update測試" id="btnUpdateScore" type="button" style="width:200px; background-color:#ff6a00;"/><br/> 74 </section> 75 </section> 76 </body> 77 </html>
執行效果:
備註:
本文版權歸大家共用,不歸本人所有,所有知識都來自於官網支援,書本,國內外論壇,大牛分享等等......後續將學習knockout.js的常用功能。
如果你喜歡本文的話,推薦共勉,謝謝!