Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js KnockoutJs:直接寻址视图中的observableArray对象_Knockout.js - Fatal编程技术网

Knockout.js KnockoutJs:直接寻址视图中的observableArray对象

Knockout.js KnockoutJs:直接寻址视图中的observableArray对象,knockout.js,Knockout.js,我想循环一个对象的ObservalArray,在这个循环中,我必须得到另一个ObservalArray的对应值。我没有成功地做到这一点 我的代码如下 模型和视图模型: //**********MODEL******************** function Configuration() { var self = this; self.properties = ko.observableArray(); } function deviceProperty() { var self

我想循环一个对象的ObservalArray,在这个循环中,我必须得到另一个ObservalArray的对应值。我没有成功地做到这一点

我的代码如下

模型和视图模型:

//**********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);
视图:


Knockoutjs给出了一个错误,表示该属性不存在

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


但是我看不出如何在对象内部直接寻址value属性?

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

因此,以下绑定应该起作用:

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

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

因此,如果您首先填充
config1()
KO开始绑定您的表,但是如果
config2()
尚未填充,您将得到一些未定义的错误。要解决此问题,您需要先更改填充顺序以填充
config2()


您可以在这里玩这个:只需更改
pupulateConfig2
pupulateConfig1
调用的顺序即可查看效果

$index
是一个可观察的属性(请参见),因此需要编写
$index()
以获取其值

因此,以下绑定应该起作用:

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

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

因此,如果您首先填充
config1()
KO开始绑定您的表,但是如果
config2()
尚未填充,您将得到一些未定义的错误。要解决此问题,您需要先更改填充顺序以填充
config2()


您可以在这里玩这个:只需更改
pupulateConfig2
pupulateConfig1
调用的顺序即可查看效果

你为什么要这么做?视图应该是干净的code@Anders因为我有这个模型,我想在不同的配置之间做一个比较屏幕。但是将代码移动到viewmdodel更重要。我就是这么说的。我知道你是对的。但我在另一个页面上通过Ajax调用生成了这些对象。制作一个具有propertyname、value1、value2的模型更为MVVM。为什么要这样做?视图应该是干净的code@Anders因为我有这个模型,我想在不同的配置之间做一个比较屏幕。但是将代码移动到viewmdodel更重要。我就是这么说的。我知道你是对的。但我在另一个页面上通过Ajax调用生成了这些对象。使用propertyname、value1、value2创建模型比MVVM更有效。
$root.config2().properties()[$index()].value()
给出
消息:TypeError:$root.config2(…).properties(…)[$index(…)]未定义。但是服务器
$root.config2().properties()[$index()]
提供
[object object]
。因此$index()是正确的,但仍然无法处理value属性。
$root.config2().properties()[$index()].value()
应该可以工作,但是如果您先填充,
config1()
KO开始填充您的表,但是如果
config2()
尚未填充,您会收到未定义的消息。因此,您需要首先填充
config2
。您可以在这里玩这个:只需更改顺序
pupupulateconfig2
pupulateConfig1
调用即可查看效果。如果您不想/无法更改填充顺序,可以使用
bindindg:
$root.config2().properties()[$index()].value()添加一些索引检查
给出
消息:TypeError:$root.config2(…)。属性(…)[$index(…)]未定义。但是服务器
$root.config2().properties()[$index()]
提供
[object object]
。因此$index()是正确的,但仍然无法处理value属性。
$root.config2().properties()[$index()].value()
应该可以工作,但是如果您先填充,
config1()
KO开始填充您的表,但是如果
config2()
尚未填充,您会收到未定义的消息。因此,您需要首先填充
config2
。你可以在这里玩:只需更改顺序
pupulateConfig2
pupulateConfig1
调用即可查看效果。如果你不想/无法更改填充顺序,可以使用
binding添加一些索引检查: