2

我很难理解何时应该使用 () 在 knockout.js 中调用我的变量。

比如说:

function RandomViewModel() {
    var self = this;
    self.randomJ = new randomSquare;
}

var randomSquare = ko.observable({
    innate: ko.observableArray([ { star: "randomStar", type: "starList" } ])
});

如果我想将 div 的文本设置为 randomJ 中的元素,代码如下:

<div data-bind="text: randomJ.innate()[0].star"></div>

但是以下方法不起作用:

<div data-bind="text: randomJ().innate()[0].star"></div>
<div data-bind="text: randomJ.innate[0].star"></div>

我只是想知道是否有人知道关于何时以及如何 () 应与 knockout.js 变量处理一起使用的明确指南 - 在 html 和 javascript 中。

我目前正在重构我以前的代码以使用淘汰赛,我想在开始进入嵌套的对象数组等之前牢牢掌握概念。我不想假设事情。

也非常欢迎对上述 javascript 发表任何评论。

4

1 回答 1

1

如果变量var是一个可观察的,你得到它的var()因为可观察的实际上是返回当前值的函数)。但是有一个方便的例外:如果您在data-bind中引用的表达式解析为可观察对象,则可以省略括号,因为 knockout.js 将识别可观察类型。

通常,对于包含具有不可观察值的可观察数组的对象的可观察对象,您必须使用以下命令:

randomJ().innate()[0].star

但是您的示例有一个缺陷: randomJ 实际上是不可观察的!在这一行

self.randomJ = new randomSquare;

你使用 observable 作为构造函数。这不是预期的用法,会导致以下结果:您得到一个新对象(不是函数,特别是不是 observable!),具有与 observable 相同的属性。后者是 randomJ.innate 实际上是 randomSquare 的原始可观察数组的原因。

它应该是:

self.randomJ = randomSquare;

或直接:

self.randomJ = ko.observable({
    innate: ko.observableArray([ { star: "randomStar", type: "starList" } ])
});

如果您打算使用 randomSquare 作为多个可观察对象的构造函数/工厂,则必须这样做:

var randomSquare = function() {
    return ko.observable({
        innate: ko.observableArray([ { star: "randomStar", type: "starList" } ])
    });
}
self.randomJ = randomSquare();
于 2013-02-12T06:51:19.463 回答