从服务器中剔除映射数据,丢失订阅 [英] Knockout mapping data from server, lost subscriptions

查看:113
本文介绍了从服务器中剔除映射数据,丢失订阅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图用从后端JSON到剔除视图模型的所选值表示多个选择. 并且每次更改每次选择时都需要检索此JSON-一切正常,但是如果我再次应用映射(ko.mapping.fromJS(test_data,ViewModel)),所有订阅都将丢失,有人知道如何避免这种情况情况?

I'm trying to represent multiple selects with its selected values from backend JSON to knockout view model. And it's needed to retrieve this JSON when each select is changed, first time - all is ok, but if I apply mapping again (ko.mapping.fromJS(test_data, ViewModel)), all subscriptions are lost does anyone know how to avoid this situation?

jsfiddle(我不知道为什么选择没有它的值,没有jsfiddle-一切正常): http://jsfiddle.net/0bww2apv/2/

jsfiddle (I don't know why selects don't have its values, without jsfiddle - all is ok): 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 !
        }
    });
});

推荐答案

最后,我用

At last I've solved my own question with knockout.reactor plugin, If we remove all auxiliary constructions, it will look like:

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);
});

通过这种方式,我们可以更新选择内容,并且订阅递归没有问题.

This way we update selects and don't have troubles with subscription recursions.

完整版本(有关详细信息,请参见控制台输出): http://jsfiddle.net/r7Lo7502/

full version (see console output for details): http://jsfiddle.net/r7Lo7502/

这篇关于从服务器中剔除映射数据,丢失订阅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆