KnockoutJs:直接在视图中寻址observableArray对象

时间:2013-06-11 10:10:20

标签: knockout.js

我想遍历一个observableArray对象,在这个循环中,我必须获得另一个observableArray的相应值。我没有成功这样做。

我的代码如下。

模型和视图模型:

//**********MODEL********************
function Configuration() {
var self = this;

self.properties = ko.observableArray();
}

function deviceProperty() {
    var self = this;

    self.property = ko.observable("");
    self.value = ko.observable("");
}

//**********VIEWMODEL****************
function compareModelView() {
var self = this;

self.config1 = ko.observable(new Configuration);
self.config2 = ko.observable(new Configuration);

$().ready(function () {
    //Load config1 and config2
});

}

//**********jQuery********************
(function ($) {
    $(document).ready(function () {
        ko.applyBindings(new compareModelView());
    });
})(jQuery);

查看:

<!-- ko foreach: config1().properties -->
     <tr>
     <td data-bind="text: property()"></td>
     <td data-bind="text: value()"></td>
     <td data-bind="text: $root.config2().properties()[$index].value()"></td>
     </tr>
<!-- /ko -->

Knockoutjs发出错误,说该属性不存在。

当我$root.config2().properties().length时,它返回一个数字(3)。 当我$root.config2().properties()[0]时,它返回[Object] [Object]。 当我$root.config2().properties()[0]时,它返回一个空字符串。

但我看不出如何直接处理对象中的value属性?

1 个答案:

答案 0 :(得分:1)

$index是一个可观察的属性(请参阅doc),因此您需要编写$index()来获取其值。

因此以下绑定应该有效:

<td data-bind="text: $root.config2().properties()[$index()].value()"></td>

虽然您的主要问题是$index(),但它本身并不能解决您的情况,因为在这种情况下集合的填充顺序很重要,因此您的当前设置会出错。

因此,如果您首先填充config1() KO开始绑定您的表,但如果尚未填充config2(),您将获得一些未定义的错误。要修复它,您需要更改填充顺序以首先填充config2()

您可以在此处播放:http://jsfiddle.net/xwjKK只需更改订单pupulateConfig2pupulateConfig1即可查看效果。