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.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
的return值,不是一个数组,而是一个可观察.
一个observable是一个函数具有各种属性,注意:
- 如果你调用
.length
,你调用the length
property that all Functions have;
- 如果您将 observable 作为函数调用,您将获得基础值,在您的例子中是一个数组。如果对结果调用
.length
,则调用 the length
property that Arrays have.
底线:两个 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" 一个全新的值 - 新数组 - 属性) .
我已经开始从他们的教程站点学习 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.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
的return值,不是一个数组,而是一个可观察.
一个observable是一个函数具有各种属性,注意:
- 如果你调用
.length
,你调用thelength
property that all Functions have; - 如果您将 observable 作为函数调用,您将获得基础值,在您的例子中是一个数组。如果对结果调用
.length
,则调用 thelength
property that Arrays have.
底线:两个 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" 一个全新的值 - 新数组 - 属性) .