【问题标题】:Knockout mapping data from server, lost subscriptions来自服务器的敲除映射数据,丢失订阅
【发布时间】:2015-03-25 04:27:02
【问题描述】:

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

jsfiddle(我不知道为什么选择没有它的值,没有 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 !
        }
    });
});

【问题讨论】:

  • 试试这个jsfiddle.net/supercool/0bww2apv/4让我知道以防万一。干杯
  • 啊,参数顺序,谢谢...订阅现在保留,但映射无法按预期工作,每次选择的更新都应重置所有选择值,换句话说,每次更改都应将所有选择重写为初始值数据,我添加了一些console.log,你可以在那里看到之前/之后的数据,“attribute_value”也被放置到错误的可观察对象中(但第一次读没问题,奇怪)。 jsfiddle.net/0bww2apv/7

标签: javascript knockout.js


【解决方案1】:

最后我用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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2015-08-10
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2012-12-14
    相关资源
    最近更新 更多