从服务器中剔除映射数据,丢失订阅
Knockout mapping data from server, lost subscriptions
我试图用从后端 JSON 到淘汰视图模型的 selected 值来表示多个 select。
并且需要在第一次更改每个 select 时检索此 JSON - 一切正常,但如果我再次应用映射 (ko.mapping.fromJS(test_data, ViewModel)) ,所有订阅都丢失了有谁知道如何避免这种情况?
jsfiddle(我不知道为什么 selects 没有它的值,没有 jsfiddle - 一切正常):
http://jsfiddle.net/0bww2apv/2/
$(ViewModel.attributes()).each(function(index, attribute) {
attribute.attribute_value.subscribe(function(name) {
console.log('SUBSCRIBE', name);
var send_data = {};
$(ViewModel.attributes()).each(function (index, attribute) {
send_data[attribute.attribute_name.peek()] = attribute.attribute_value.peek();
if (attribute.attribute_value() === null) {
send_data = null;
return false;
}
});
if (send_data) {
console.log('REQUEST TO BACKEND: ', ko.toJSON(send_data));
ko.mapping.fromJS(test_data, ViewModel);
// subscriptions is lost here !
}
});
});
我终于用 knockout.reactor 插件解决了我自己的问题,
如果我们删除所有辅助结构,它将看起来像:
var ViewModel = ko.mapping.fromJS(test_data);
ko.applyBindings(ViewModel);
ko.watch(ViewModel, { depth: -1 }, function(parents, child, item) {
// here we need to filter watches and update only when needed, see jsfiddle
ko.mapping.fromJS(test_data2, {}, ViewModel);
});
通过这种方式我们可以更新选择并且不会遇到订阅递归的问题。
完整版(详见控制台输出):http://jsfiddle.net/r7Lo7502/
我试图用从后端 JSON 到淘汰视图模型的 selected 值来表示多个 select。 并且需要在第一次更改每个 select 时检索此 JSON - 一切正常,但如果我再次应用映射 (ko.mapping.fromJS(test_data, ViewModel)) ,所有订阅都丢失了有谁知道如何避免这种情况?
jsfiddle(我不知道为什么 selects 没有它的值,没有 jsfiddle - 一切正常): http://jsfiddle.net/0bww2apv/2/
$(ViewModel.attributes()).each(function(index, attribute) {
attribute.attribute_value.subscribe(function(name) {
console.log('SUBSCRIBE', name);
var send_data = {};
$(ViewModel.attributes()).each(function (index, attribute) {
send_data[attribute.attribute_name.peek()] = attribute.attribute_value.peek();
if (attribute.attribute_value() === null) {
send_data = null;
return false;
}
});
if (send_data) {
console.log('REQUEST TO BACKEND: ', ko.toJSON(send_data));
ko.mapping.fromJS(test_data, ViewModel);
// subscriptions is lost here !
}
});
});
我终于用 knockout.reactor 插件解决了我自己的问题, 如果我们删除所有辅助结构,它将看起来像:
var ViewModel = ko.mapping.fromJS(test_data);
ko.applyBindings(ViewModel);
ko.watch(ViewModel, { depth: -1 }, function(parents, child, item) {
// here we need to filter watches and update only when needed, see jsfiddle
ko.mapping.fromJS(test_data2, {}, ViewModel);
});
通过这种方式我们可以更新选择并且不会遇到订阅递归的问题。
完整版(详见控制台输出):http://jsfiddle.net/r7Lo7502/