如果我理解正确,该数组是 ViewModel 的成员(您可以控制它),但您不能将其更改为 observableArray,因为您无法控制的东西会使用普通数组语法修改数组。此外,您可以在这些黑盒函数运行后采取一些措施,以通知模型数组可能已发生变异。
我们可以做到。定义一个(内部)observableArray 并在包装它的 ViewModel 上定义一个公共属性。这使您可以使用普通数组语法访问observableArray。但是,对数组的单个(非observable)元素的更改不会发送通知,因此您需要提供对内部observableArray 的valueHasMutated 方法的调用,以便在您进行更改时调用。
var vm = (function () {
var arrayImpl = ['hi'];
var obsArray = ko.observableArray(arrayImpl);
var itemNumbers = [1,2,3,4,5,6,7,8,9];
var self = {
itemNumbers: itemNumbers,
selectedItemNumber: ko.observable(1),
newValue: ko.observable(),
arrayHasMutated:obsArray.valueHasMutated
};
Object.defineProperty(self, 'plainArray', {
get: obsArray,
set: obsArray
});
return self;
});
ko.applyBindings(vm);
我们的应用可以像使用常规数组一样使用plainArray 属性。进行更新时,请致电arrayHasMutated。
Item Number: <select data-bind="options:itemNumbers, value:selectedItemNumber"></select>
<br />
New Value: <input data-bind="value:newValue" />
<button data-bind="click:function () { var idx=selectedItemNumber()-1; plainArray[idx] = newValue(); arrayHasMutated(); }">Set it</button>
<ol data-bind="foreach:plainArray">
<li data-bind="text:$data"></li>
</ol>
<br />
Length: <span data-bind="text:plainArray.length"></span>
试试看:http://jsfiddle.net/4jogh3k5/1/