knockout.js指南()

时间:2013-02-12 05:15:57

标签: javascript knockout.js

我很难理解何时应该使用()在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中。

我目前正在重构我以前的代码以使用knockout,我想在开始跳转到嵌套的对象数组之前牢牢抓住概念。我宁愿不做假设。

对上述javascript的任何评论也都非常受欢迎。

1 个答案:

答案 0 :(得分:1)

如果变量var是一个可观察对象,则使用var()得到(因为observable实际上是返回当前值的函数)。但是有一个方便的例外:如果你在数据绑定中引用的表达式解析为一个observable,你可能省略了parantheses,因为knockout.js会识别可观察的类型。

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

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

但是你的例子有一个缺陷:randomJ实际上是没有观察到的!在这一行

self.randomJ = new randomSquare;

使用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();