2012-09-10 52 views
1

我有下面的代碼片斷 JQuery的 HTML文件內:映射:的foreach結合工作僅在第一次

$.getJSON("/events/", function (data) { 
    viewModel = ko.mapping.fromJS(data); 
    ko.applyBindings(viewModel); 
}); 

時,例如,在用戶按下一個按鈕,返回JSON等的代碼被執行:

<ul data-bind="foreach: Events"> 
    <li><span data-bind="text: Name"></span></li> 
</ul> 

{"Events":[{"Name":"Event1"},{"Name":"Event2"},{"Name":"Event3"}]} 

該結果(使用 KnockoutJS)到鏈接

一切工作正常第一次調用$.GetJSON。我得到了我想要的東西,這是(瀏覽器輸出):

  • 事件1
  • 事件2
  • EVENT3

但在後續調用 「$的getJSON」我收到以下錯誤螢火蟲

NotFoundError: Node was not found.

containerNode.insertBefore(nodeToInsert, insertAfterNode.nextSibling);

而且我沒有得到任何列表項。

什麼我可以做錯了什麼?

非常感謝您提前。

回答

1

Knockout的重點在於處理視圖和視圖模型之間的交互。在這種情況下,您嘗試更新事件列表以響應按鈕單擊。點擊該按鈕應該鏈接到您的視圖模型的函數,而列表應該與可觀察到的數組當你點擊按鈕的經更新。我在這裏提琴把這個在一起:http://jsfiddle.net/mbest/uZb3e/和重要的部分是如下:

<button type=button data-bind="click: updateEvents">Update</button> 
<ul data-bind="foreach: data.Events"> 
    <li><span data-bind="text: Name"></span></li> 
</ul> 

的Javascript:

var viewModel = { 
    data: ko.mapping.fromJS({"Events":[]}), 
    updateEvents: function() { 
     var self = this; 
     $.getJSON("/events/", function (data) { 
      ko.mapping.fromJS(newData, self.data); 
     });​ 
    } 
}; 

ko.applyBindings(viewModel);​ 
1

我的朋友托馬斯Brattli找到了解決辦法:

<ul data-bind="template: { name: 'template', foreach: Events }"></ul> 

<script id="template" type="text/html"> 
    <li><span data-bind="text: Name"></span></li> 
</script> 

謝謝!

+1

您的解決方案可以工作(使用命名模板),但真正的問題是你在同一個視圖上多次調用'ko.applyBindings'。這不被Knockout支持,並且不可避免地會導致問題。 –

+0

謝謝Michael!你認爲在這種情況下實施會更好嗎? –

+1

看到我的答案.. –

相關問題