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