2014-09-18 65 views
0

比方说,我有一个设置在嵌套/命名空间的对象淘汰赛绑定列表,类似这样:将嵌套对象中的值与相应的敲除绑定进行匹配?

var bindings = { 
    event: { 
     eventid: ko.observable(), 
     office: ko.observable(), 

     employee: { 
      name: ko.observable(), 
      group: ko.observable() 
     } 
    }, 
    ... 
} 

现在让我们说有一些不同的数据集可能会被加载到这一点 - 这样一个做一个Ajax查询并得到一个JSON结果是这样的:

{ 
    "defaults": { 
     "event": { 
      "eventid": 1234, 

      "employee": { 
       "name": "John Smith" 
      } 
     }, 
     ... 
    } 
} 

请注意,不是每个绑定有一个默认值 - 但所有默认值都映射到一个结合。我想要做的是将默认值读入它们对应的任何敲除绑定。

肯定有办法traverse a nested object并阅读它的值。为该示例添加额外的参数,我可以跟踪默认的完整键(例如event.employee.name)。我被难倒的地方是采用default的钥匙,并用它来瞄准相关的淘汰赛结合。很明显,即使我有key = "event.employee.name",bindings.key也没有引用我想要的。我只能想到使用eval(),这让我的口感不好。

如何使用一个键来引用不同对象中的相同位置?也许淘汰赛提供了一种方法来自动映射一个对象到它的绑定,我只是忽略了它?任何见解都会有所帮助。提前致谢!

回答

2

我建议你看看Knockout Mapping Plugin,它将完成你想要做的大部分工作。如果没有锻炼,那么你可以把你的bindings对象变成一系列接受数据参数的构造函数。像

var Employee = function (data){ 
 
\t var self = this; 
 
    \t self.name = ko.observbale(data.name || ''); 
 
    \t self.group = ko.observable(data.group); 
 
}; 
 

 
var Event = function(data){ 
 
\t var self = this; 
 
    \t self.eventid = ko.observable(data.id || 0); 
 
    \t self.office = ko.observable(data.office || ''); 
 
    \t self.employee = ko.observable(new Employee(data.employee)); 
 
}; 
 

 

 
var bindings = function(data){ 
 
    var self = this; 
 
    \t self.event = ko.observable(new Event(data)); 
 
}

+0

呵呵,那就来看看吧。这很聪明,我从来没有想过在一个可观察的元素中粘贴一个函数。希望我能+2这个! – CodeMoose 2014-09-19 14:41:48

+0

很高兴帮助:-) – 2014-09-21 00:55:05

0

东西,我会来把内森费舍尔的解决方案为未来的更新,但我想和大家分享我发现现在以及修复。每次defaults对象递归时,我只需传递相应的绑定对象,而不是跟踪整个键路径。

var setToDefaults = function(data){ 
    loopDefaults(data.defaults, bindings); 
}; 

var loopDefaults = function(defaults, targ){ 
    for(var d in defaults){ 
     if(defaults.hasOwnProperty(d) && defaults[d]!==null){ 
      if(typeof(defaults[d])=="object"){ 
       loopDefaults(defaults[d], targ[d]); 
      }else{ 
       // defaults[d] is a value - set to corresponding knockout binding 
       targ[d](defaults[d]); 
      } 
     } 
    } 
};