Knockout.js 敲除映射嵌套对象绑定在为null时不更新
使用ko.mapping.fromJSON,只要定义了嵌套对象,我就可以从JSON绑定。当我将嵌套对象更新为null或空时,绑定就会中断 在这段代码中,我使用model.nextDataset函数遍历了五个不同的数据集。当数据集到达第四个和第五个变体时,它会断开与内部对象的绑定Knockout.js 敲除映射嵌套对象绑定在为null时不更新,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,使用ko.mapping.fromJSON,只要定义了嵌套对象,我就可以从JSON绑定。当我将嵌套对象更新为null或空时,绑定就会中断 在这段代码中,我使用model.nextDataset函数遍历了五个不同的数据集。当数据集到达第四个和第五个变体时,它会断开与内部对象的绑定 var datasets = ["{\"id\": 1,\"reference\": \"reference1\",\"inner\": {\"id\": 1,\"name\": \"name1\"}}", "{
var datasets = ["{\"id\": 1,\"reference\": \"reference1\",\"inner\": {\"id\": 1,\"name\": \"name1\"}}",
"{\"id\": 1,\"reference\": \"reference2\",\"inner\": {\"id\": 1,\"name\": \"name2\"}}",
"{\"id\": 1,\"reference\": \"reference3\",\"inner\": {\"id\": null,\"name\": null}}",
"{\"id\": 1,\"reference\": \"reference3\",\"inner\": {}}",
"{\"id\": 1,\"reference\": \"reference3\",\"inner\": null}"];
var mapping = {
'create': function (options) {
return new Model(options.data);
},
'key': function (data) {
return ko.utils.unwrapObservable(data.id);
},
'inner': {
'create': function (options) {
return new InnerModel(options.data);
}
},
'key': function (data) {
return ko.utils.unwrapObservable(data.id);
}
};
/*
var innerMapping = {
'key': function(data) {
return ko.utils.unwrapObservable(data.id);
}
};
*/
var InnerModel = function (data) {
var self = this;
ko.mapping.fromJS(data, {}, self);
self.innerName = ko.computed(function () {
return self.name() + " computed";
}, self);
};
var Model = function (data) {
var self = this;
ko.mapping.fromJS(data, mapping, self);
self.innerName = ko.computed(function () {
return self.inner.name() + " computed";
}, self);
}
var model = {
dataset: ko.observable(0),
model: ko.mapping.fromJSON(datasets[0], mapping, model),
nextDataset: function () {
model.dataset(model.dataset() + 1);
if (datasets.length === model.dataset()) {
model.dataset(0);
}
ko.mapping.fromJSON(datasets[model.dataset()], mapping, model.model);
}
}
ko.applyBindings(model);
附带的html:
<div id="testko">
<p>Dataset: <span data-bind="text: dataset"></span><p>
<input type="text" data-bind="value: model.reference" /><br>
<div data-bind="with: model.inner"><input type="text" data-bind="value: innerName" /><br></div>
<input type="text" data-bind="value: model.innerName" /><br>
<input type="button" data-bind="click: nextDataset" value="Next Dataset" />
</div>
数据集:
我制作了一个JSFIDLE来尝试并演示这一点:
我确信我在某种程度上映射不正确,但我使用knockout的时间还不够长,无法说出原因。您的计算可观察对象正在崩溃,因为它正在访问self.name()其中self设置为null-这是映射插件的正常行为,您正确使用with绑定可以阻止大多数人在这种情况下遇到的问题。映射插件无法为空对象创建对象结构
问题是,您在innername computed observable中得到一个javascript错误,因此淘汰库不会继续运行-只需在self.name()周围添加一个null检查,就像您基本上使用“with”绑定一样。您正在访问inner.name,但inner为null!