myObservableArray.length和myObservableArray()之间的区别。长度

时间:2015-01-24 06:37:40

标签: javascript knockout.js

我已经开始从他们的教程网站学习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的对象,那么这背后有任何技术原因吗?

1 个答案:

答案 0 :(得分:2)

您假设myObservableArray.lengthmyObservableArray().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属性是非常不同的东西。几乎总是你会对底层数组的长度感兴趣,这就是为什么你应该首先调用你的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”数组“设置为”属性)。