1

我想循环一个 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 属性?

4

1 回答 1

1

$index是一个可观察的属性(见doc),所以你需要写$index()来获取它的值。

所以下面的绑定应该可以工作:

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

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

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

你可以在这里玩这个:http: //jsfiddle.net/xwjKK只需更改顺序pupulateConfig2pupulateConfig1调用以查看效果。

于 2013-06-11T11:14:40.653 回答