2015-03-25 83 views
0

我想要代表多个选择与从后端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 ! 
     } 
    }); 
}); 
+0

试试这个http://jsfiddle.net/supercool/0bww2apv/4/让我知道只是在情况。干杯 – 2015-03-25 10:12:55

+0

argh,参数顺序,谢谢...订阅现在保留,但映射不能按预期工作,每个选择的更新应该重置所有选择值,换句话说,每个更改都应该将所有选择重写为初始数据,我已经添加几个console.log,你可以在数据前后看到,还有“attribute_value”被放置到错误的观察对象(但是第一次读取可以,奇怪)。 http://jsfiddle.net/0bww2apv/7/ – xwild 2015-03-26 03:40:30

回答

0

最后,我已经解决了我的问题与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/