Knockout.js(二):監控數組屬性(Observables Arrays)

  若是想發現並響應一個對象的變化,就應該使用監控屬性(observables),若是想發現並響應一個集合的變化,就須要使用監控屬性數組(observableArray)。在不少狀況下,它都很是有用,好比你要在UI上須要顯示/編輯的一個列表數據集合,而後對集合進行添加和刪除。數據庫

 

  聲明ObservableArray 數組

var myObservableArray = ko.observableArray();
myObservableArray.push("some value");

  將一個對象放在observableArray裏不會使這個對象自己的屬性變化可監控,observable只會監控它擁有的對象,並在這些對象添加或刪除的時候發出通知。瀏覽器

  若是想在初始化數組的時候給其賦初值,能夠在構造器里加入這些初始對象。函數

var anotherObservableArray = ko.observableArray([
    {name: "Bungle", type: "Bear" }, 
    {name: "George", type: "Hippo" },
    {name: "Zippy", type: "Unknown" }
]);

  一個observableArray其實就是一個observable的監控對象,只不過他的值是一個數組,能夠用JavaScript的數組函數進行數組的訪問:spa

alert('The length of the array is ' + myObservableArray().length);    //The length of the array is 1
alert('The first element is ' + myObservableArray()[0]);              //The first element is some value
alert('The length of the array is ' + anotherObservableArray().length);    //The length of the array is 3
alert('The first element is ' + anotherObservableArray()[0]);              //The first element is [object Object]

 

  ObservableArray的經常使用方法code

  能夠觀察到上面訪問數組的時候,使用的是JavaScript的函數,但KO提供了更好的功能等價函數,有如下優勢:對象

  ♦ 兼容全部瀏覽器。blog

  ♦ 在數組操做函數方面(如push和splice等),KO能夠自動觸發依賴跟蹤,並通知全部的訂閱者它的變化,而後讓UI界面相應地自動更新。排序

  ♦ 語法更方便(如myObservableArray.push(...)比myObservableArray().push(...)來的方便吧??)索引

  1.indexOf()

    myObservableArray.indexOf('Blah'):返回以0爲第一個索引的第一個Blah的匹配項的索引

  2.slice()

    myObservableArray.slice(...):返回給定的從開始索引到結束索引之間全部的對象集合

  3.push()

    myObservableArray.push(‘some new value’):在數組末尾添加一個新項

  4.pop()

    myObservableArray.pop():刪除數組最後一項並返回返回該項

  5.unshift()

    myObservableArray.unshift(‘some new value’):在數組頭部添加一個項

  6.shift()

    myObservableArray.shift():刪除數組頭部第一項並返回該項

  7.reverse()

    myObservableArray.reverse():翻轉整個數組的順序

  8.sort()

    myObservableArray.sort():給數組排序

  9.splice()

    myObservableArray.splice(1,3):刪除指定開始索引"1"和指定數目"3"的數組對象元素(第2,3,4個元素)。

  10.remove和removeAll

    myObservableArray.remove(someItem); // 刪除全部等於someItem的元素並將被刪除元素做爲一個數組返回
    myObservableArray.remove(function(item) { return item.age < 18 }); // 刪除全部age屬性小於18的元素並將被刪除元素做爲一個數組返回
    myObservableArray.removeAll(['Chad', 132, undefined]); // 刪除全部等於'Chad', 123, or undefined的元素並將被刪除元素做爲一個數組返回

  11.destroy和destroyAll

    myObservableArray.destroy(someItem) 找出全部等於someItem的元素並給他們添加一個屬性_destroy,並賦值爲true
    myObservableArray.destroy(function(someItem) { return someItem.age < 18 }) 找出全部age屬性小於18的元素並給他們添加一個屬性_destroy,並賦值爲true
    myObservableArray.destroyAll(['Chad', 132, undefined]) 找出全部等於'Chad', 123, 或undefined 的元素並給他們添加一個屬性_destroy,並賦值爲true   

  在KO render一個foreach模板的時候,會自動隱藏帶有_destroy屬性而且值爲true的元素。   因此若是你的"delete」按鈕調用destroy(someItem) 方法的話,UI界面上的相對應的元素將自動隱藏,而後等你提交這個JSON對象到Rails上的時候,這個元素項將從數據庫刪除(同時其它的元素項將正常的插入或者更新)。

相關文章
相關標籤/搜索