2012-11-13 89 views
1

我在使用淘汰賽迭代我的json數據時遇到了問題。 我的視圖模型看起來像:淘汰賽js。每個孩子的孩子不工作

var ViewModel = function() { 
    var self = this; 
    self.Summary = ko.observableArray(); 
    $.getJSON('some api url', function(result) { 
     ko.mapping.fromJS(result, {}, self); 
    }); 
} 
ko.applyBindings(new ViewModel());  

我的JSON數據是這樣的:

{ 
Summary: { 
    Details: [ 
     { 
      Name: "Foo", 
      Id: 1, 
      Detail: "Some Data" 
     }, 
     { 
      Name: "Bar", 
      Id: 2, 
      Detail: "Another Data" 
     } 
    ], 
    SummaryOverview: "BlahBlah", 
    AnotherObject: [ 
     { 
      Name: "My Name" 
      AnotherChildObject: [ 
       { 
        name:"some name" 
       } 
      ] 
     } 
    ] 
} 

} 我的問題是我遍歷經過我的數據是這樣的:

<div data-bind="foreach: Summary">    
    <div data-bind="text: Details.Detail"></div> 
</div> 

OR

<div data-bind: "foreach: Summary.Details"> 
    <div data-bind="text: Detail"></div> 
</div> 

如何顯示細節?上面的HTML不適合我。 非常感謝!

+1

檢查您的foreach - 看起來像拼寫爲「Summary」的摘要爲「Summarry」 – Disgone

+1

您的數據不包含任何數組,它甚至不是有效的......所以它根本無法工作。它應該是什麼? –

+0

您的JSON無效,並且有幾種可能的解釋方式。我們不知道你想用它代表什麼,所以請給我們提供有效的JSON數據,然後我們可以告訴你如何修改你的javascript。 和Jeff Mercado一樣說:你的JSON中沒有數組。如果你想使用foreach,必須有一個數組。請糾正它。 而作爲Disgone賽義夫,您的HTML使用錯誤的名稱來訪問數據。 正如我所說:請在您的問題和特別是你的例子更加努力。如果你不認爲你的問題足夠深入徹底,爲什麼我們呢? – EmilioMg

回答

1

ko.mapping的問題在於您的可觀察物將被新的可觀察物取代。爲了澄清,Summary,這是一個observableArray,將由ko.mapping由一個新的observableArray取代。

有兩種方法可以解決這個問題。第一種選擇是與applyBindings等到真實陣列已被創建:

var ViewModel = function() { 
    var self = this; 
    // no need to set the array, it will be overwritten anyway 
    // self.Summary = ko.observableArray(); 
} 

var vm = new ViewModel(); 
$.getJSON('some api url', function(result) { 
    ko.mapping.fromJS(result, {}, vm); 
    ko.applyBindings(vm); 
}); 

備選2是引導(bootstrap)與初始(空)的數據視圖模型。如果您在空數組上應用ko.mapping,則下一次調用ko.mapping將更新現有數組,而不是覆蓋它。像這樣:

var ViewModel = function() { 
    var self = this; 
    var init = { Summary: [] }; 
    ko.mapping.fromJS(init, {}, self); 

    $.getJSON('some api url', function(result) { 
     ko.mapping.fromJS(result, {}, self); 
    }); 
} 

ko.applyBindings(new ViewModel()); 

我通常替代2.方案1走會造成延遲ko.applyBindings被調用之前,這可能會導致一些用戶界面閃爍(和不需要的元素可能是可見的,等等)。

+0

嗨克里斯托弗,感謝您的答覆。我嘗試了您提供的兩種解決方案,但無法使其正常工作。我認爲我的HTML代碼已關閉。你會如何做foreach數據綁定?謝謝 – user1175857

+0

好吧,我得到它的工作。謝謝! – user1175857