2014-09-18 28 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]); 
      } 
     } 
    } 
};