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上的时候,这个元素项将从数据库删除(同时其它的元素项将正常的插入或者更新)。

相关文章
相关标签/搜索