我已经开始从他们的教程网站学习knockoutjs,特别是observable arrays上的位。我正在练习一些例子。
我想要求对此代码进行非常简单的澄清:
var myObservableArray = ko.observableArray();
// Initially an empty array
myObservableArray.push('Some value');
alert('The length of the array is ' + myObservableArray().length);
在上面的示例中,为什么使用myObservableArray().length
代替myObservableArray.length
,因为它们都提供相同的输出?
在任何传统语言中,如果我想引用一个我将使用myObservableArray.length
的对象,那么这背后有任何技术原因吗?
答案 0 :(得分:2)
您假设myObservableArray.length
和myObservableArray().length
给出相同的输出是错误的:
ko.applyBindings({ myObservableArray: ko.observableArray(["A", "B", "C", "D"]) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<p>myObservableArray.length = <span data-bind="text: myObservableArray.length"></span></p>
<p>myObservableArray().length = <span data-bind="text: myObservableArray().length"></span></p>
这是因为myObservableArray
将包含调用函数ko.observableArray
的返回值,该函数不是数组,而是 observable 。
可观察是具有各种属性的函数 ,并注意:
.length
,请致电the length
property that all Functions have; .length
,请致电the length
property that Arrays have。底线:两个length
属性是非常不同的东西。几乎总是你会对底层数组的长度感兴趣,这就是为什么你应该首先调用你的observable函数来“获取”这个值。
这是另一种看待这种情况的方法,特别是在视图模型的上下文中。假设这个视图模型:
var MainViewModel = function() {
var self = this;
self.myObservableArray = ko.observableArray(["A", "B", "C"]);
}
在您的视图模型中,您可以将“myObservableArray
”视为属性,以三种不同的方式使用:
self.myObservableArray
”作为对属性本身的指针/引用; self.myObservableArray()
”作为属性的“getter”(以“获取”值:数组); self.myObservableArray(["new item"])
”作为属性的“setter”(将一个全新的值 - “new”数组“设置为”属性)。