Javascript 使用敲除映射插件定义子数组成员上的计算可观测值
我有以下资料:Javascript 使用敲除映射插件定义子数组成员上的计算可观测值,javascript,mvvm,knockout.js,Javascript,Mvvm,Knockout.js,我有以下资料: // Child Array is Cards, trying to add computed observable for each child var CardViewModel = function (data) { ko.mapping.fromJS(data, {}, this); this.editing = ko.observable(false); }; var mapping = { 'cards': { // This nev
// Child Array is Cards, trying to add computed observable for each child
var CardViewModel = function (data) {
ko.mapping.fromJS(data, {}, this);
this.editing = ko.observable(false);
};
var mapping = {
'cards': { // This never gets hit, UNLESS I remove the 'create' method below
create: function (options) {
debugger;
return new CardViewModel(options.data);
}
},
create: function(options) {
var innerModel = ko.mapping.fromJS(options.data);
innerModel.cardCount = ko.computed(function () {
return innerModel.cards().length;
});
return innerModel;
}
};
var SetViewModel = ko.mapping.fromJS(setData, mapping);
debugger;
ko.applyBindings(SetViewModel);
但是,我无法使“cards”绑定工作——除非我删除“create”方法,否则无法访问该代码。我试着按照淘汰网站上的例子:
它们对子对象定义执行以下操作:
var mapping = {
'children': {
create: function(options) {
return new myChildModel(options.data);
}
}
}
var viewModel = ko.mapping.fromJS(data, mapping);
使用如下定义的ChildModel:
var myChildModel = function(data) {
ko.mapping.fromJS(data, {}, this);
this.nameLength = ko.computed(function() {
return this.name().length;
}, this);
}
我已经在这上面花了一天的时间,我一辈子都不明白为什么这不起作用。任何提示都会很棒
编辑:这是我正在处理的一些问题。它只在结果中显示第1面,因为此处无法识别“编辑”:
<div data-bind="visible: !$parent.editing()" class="span5 side-study-box">
这是我在运行chrome时遇到的错误:
未捕获错误:无法分析绑定。消息:TypeError:Object
没有“编辑”方法;绑定值:可见:$parent.editing()
你不需要括号。我刚从
!$parent.editing()
to
!$parent.editing
查看更新的小提琴您不需要括号。我刚从
!$parent.editing()
to
!$parent.editing
请参见更新的FIDLE您已覆盖视图模型的
创建
行为。映射插件不会为您调用属性的任何其他处理程序。因为您是从create
方法中映射的,所以将卡
处理程序移动到该方法中
var mapping = {
create: function(options) {
var innerModel = ko.mapping.fromJS(options.data, {
'cards': {
create: function (options) {
debugger;
return new CardViewModel(options.data);
}
}
});
innerModel.cardCount = ko.computed(function () {
return innerModel.cards().length;
});
return innerModel;
}
};
您已覆盖视图模型的
创建
行为。映射插件不会为您调用属性的任何其他处理程序。因为您是从create
方法中映射的,所以将卡
处理程序移动到该方法中
var mapping = {
create: function(options) {
var innerModel = ko.mapping.fromJS(options.data, {
'cards': {
create: function (options) {
debugger;
return new CardViewModel(options.data);
}
}
});
innerModel.cardCount = ko.computed(function () {
return innerModel.cards().length;
});
return innerModel;
}
};
你能把小提琴放好让我们轻松吗?刚刚加了一把,谢谢阿什你能把小提琴放好让我们轻松吗?刚刚加了一把,谢谢阿什哇,谢谢杰夫。这是一个简单的解决方案。如果您不介意的话,还有一个问题-对于cardCount方法,我应该使用innerModel.cards()还是使用this.cards()?您将无法使用
this
,因为您没有将innerModel
作为第二个参数传递。如果你这样做了,那么你可以使用这个
。哇,谢谢杰夫。这是一个简单的解决方案。如果您不介意的话,还有一个问题-对于cardCount方法,我应该使用innerModel.cards()还是使用this.cards()?您将无法使用this
,因为您没有将innerModel
作为第二个参数传递。如果您这样做了,那么您可以使用此
。进行更改是错误的。从未创建可观察的编辑
,因此尝试从中获取值(通过调用它)失败。您建议的更改将逻辑从“未编辑卡片时可见”更改为“未定义编辑可观察对象时可见”,这是不正确的。@您是否同意。谢谢你的解释。击倒就是击倒我。。。再次感谢您的帮助,如果代码>不在那里。如果表达式只是返回一个可观察值,那么knockout将自动打开该值。进行这种更改是错误的。从未创建可观察的编辑
,因此尝试从中获取值(通过调用它)失败。您建议的更改将逻辑从“未编辑卡片时可见”更改为“未定义编辑可观察对象时可见”,这是不正确的。@您是否同意。谢谢你的解释。击倒就是击倒我。。。再次感谢您的帮助,如果代码>不在那里。如果表达式只是返回一个可观察值,那么knockout将自动打开该值。