考虑通过knockout映射插件生成的以下ViewModel。
var originalData = {
"QuoteSelectedViewModel": {
"ProductName": "Select",
"CoverQuotesViewModel": [
{
"Code": 1,
"Label": "Première Assistance 24h/24 (GRATUITE)",
"IsMandatory": true,
"IsSelected": true,
"DependsOn": []
},
{
"Code": 2,
"Label": "Assistance PLUS 24h/24",
"IsMandatory": false,
"IsSelected": false,
"DependsOn": []
},
{
"Code": 8,
"Label": "Heurts Animaux / Force de la Nature",
"IsMandatory": false,
"IsSelected": false,
"DependsOn": [
2
]
},
]}
}
var viewModel = ko.mapping.fromJS(originalData);
ko.applyBindings(viewModel);
<div data-bind="with: QuoteSelectedViewModel">
selected quote is : <span data-bind="text: ProductName"></span>
<!-- ko foreach: CoverQuotesViewModel -->
<br/>
<div data-bind: if: IsVisible>
<input type="checkbox" data-bind="checked: IsSelected"></input>
<input type="text" data-bind="value: Label, enable: IsSelected"></input>
</div>
<!-- /ko -->
</div>
现在,我想在IsVisible返回false时隐藏div。 IsVisible尚不存在,它应该是CoverQuotesViewModel数组的每个元素上的计算可观察函数。
如何在每个元素上生成此计算的可观察函数?
由于
的 [编辑] 的 我在这里添加了一个jsfiddle:http://jsfiddle.net/graphicsxp/fpKWM/
[EDIT2] 实际上,淘汰文件很清楚如何做到这一点:
当然,在创建回调中你可以再做一次调用 ko.mapping.fromJS如果你愿意的话。一个典型的用例可能是你想要的 用一些额外的东西来扩充原始的JavaScript对象 计算的观察值:
var myChildModel = function(data){ ko.mapping.fromJS(data,{},this);
this.nameLength = ko.computed(function() { return this.name().length; }, this); }
[编辑]
以下是保罗建议的完整代码: (getQuotesSuccess是一个AJAX成功处理程序)
viewModel.getQuotesSuccess = function (result) {
var myCoverQuotesViewModel = function (data, parent) {
var self = this;
ko.mapping.fromJS(data, {}, this);
self.IsVisible = ko.computed(function () {
var visible = true;
if (self.DependsOn().length > 0) {
$.each(self.DependsOn(), function (index, value) {
var dependency = viewModel.QuoteSelectedViewModel().CoverQuotesViewModel.filterByProperty("Code", value);
if (dependency().length > 0) {
visible = visible & dependency()[0].IsSelected();
} else {
visible = false;
}
});
}
return visible;
}, this);
}
var mapping = {
'CoverQuotesViewModel': {
create: function (options) {
return new myCoverQuotesViewModel(options.data, options.parent);
}
}
}
ko.mapping.fromJS(result, mapping, viewModel);
};
答案 0 :(得分:3)
好的,回到我之前的回答,修改一下,所以看到这个答案的其他人实际上得到了正确的版本!
您需要创建一个子viwe模型,并使用映射插件自动填充它,然后添加您计算的observable:
function CoverQuotesViewModel(data)
{
var self = this;
ko.mapping.fromJS(data, {}, self);
// Copy the data to each property.
self.IsVisible = ko.computed(function()
{
// your logic for each quote
});
}
然后,您需要使用创建地图来映射主视图模型,并在此创建子视图模型:
var mapping = {
'CoverQuotesViewModel': {
create: function(options) {
var model = new CoverQuotesViewModel(options.data);
return model;
}
}
}
var viewModel = ko.mapping.fromJS(data, mapping);
您不需要将this
传递给计算器,因为您正在引用self,这是您存储的版本。