从服务器中删除映射数据,丢失订阅

Knockout mapping data from server, lost subscriptions

本文关键字:数据 服务器 删除 映射      更新时间:2023-09-26

我试图用它的选定值来表示从后端JSON到淘汰视图模型的多个选择。当每次选择都被更改时,第一次需要检索这个JSON-一切都可以,但如果我再次应用映射(ko.mapping.fromJS(test_data,ViewModel)),所有订阅都会丢失。有人知道如何避免这种情况吗?

jsfiddle(我不知道为什么select没有它的值,没有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/