myObservableArray.length 和 myObservableArray().length 之间的区别

Difference between myObservableArray.length and myObservableArray().length

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

您认为 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的return值,不是一个数组,而是一个可观察.

一个observable是一个函数具有各种属性,注意:

底线:两个 length 属性是非常不同的东西。您几乎总是会对底层数组的长度感兴趣,这就是为什么您应该首先将可观察对象作为函数调用以 "get" 值。


这是另一种看待这个问题的方式,特别是在视图模型的上下文中。假设这个视图模型:

var MainViewModel = function() {
    var self = this;
    self.myObservableArray = ko.observableArray(["A", "B", "C"]);
}

在您的视图模型中,您可以将“myObservableArray”视为 属性,以三种不同的方式使用:

  • 将“self.myObservableArray”用作 pointer/reference 到 属性 本身;
  • 使用“self.myObservableArray()”作为"getter"的属性(到"get"的值:一个数组);
  • 使用“self.myObservableArray(["new item"])”作为 属性 的 "setter"("set" 一个全新的值 - 新数组 - 属性) .