2011-09-27 34 views
1

這個頁面的想法是,我有一個文本字段,當你輸入三個或更多字符時,觸發一個ajax查詢來搜索用戶列表。這部分工作正常,並且console.log()調用演示了我獲得了很好的數據並將其分配給我的視圖模型的.users字段。爲什麼我的knockoutjs observableArray數據更新不觸發任何事情?

問題是,這不會觸發任何可觀察到的行爲。在HTML中,我有一個與foreach: users綁定的模板,並且我有一個跨越userCount的跨度,兩者都沒有更新。但是,如果我在控制檯上鍵入viewModel.users().length,我會得到正確的值。但我不知何故破壞了可觀察性。

var viewModel = { 
    users: ko.observableArray([]), 
    term: ko.observable('') 
}; 


ko.dependentObservable(function() { 
    if (this.term().length > 2) { 
     $.get('http://mydatasource.com/path/?term=' + this.term(), 
     function(data) { 
      viewModel.users(data); 
      console.log(viewModel.users()); 
     }) 
    } 

}, viewModel); 

viewModel.userCount = ko.dependentObservable(function() { 
    return this.users().length; 
}, viewModel); 


ko.applyBindings(viewModel); 

編輯:只是修改了我的阿賈克斯獲得dependentobservable功能:

ko.dependentObservable(function() { 
    if (this.term().length > 2) { 
     $.get('http://mydatasource.com/path/?term=' + this.term(), 
     function(data) { 
      viewModel.users([]); 
      $.each(data, function(i, item) { 

       console.log(item.label); 
       viewModel.users.push({value: ko.observable(item.value), label: ko.observable(item.label)}); 

      }); 
     }) 
    } 

}, viewModel); 

沒有區別的。但是我可以在控制檯中看到正確返回的標籤值,再次,viewModel.users()。length給出了我很滿意的答案。

編輯:我用小提琴中提供的@RP尼邁爾替換了我的視線,它工作...所以這是關於我的觀點。以下是我的:

<input data-bind="value: term, valueUpdate: 'afterkeydown'"><br/> 
<h2><span data-bind="value: userCount"></span> Users Listed</h2> 
<table data-bind="foreach: users"> 
    <tr><td data-bind="text: label"></td><td data-bind="text:value"></td></tr> 
</table> 

<div data-bind="text: ko.toJSON(viewModel)"></div> 
+0

從您發佈的代碼看起來很好。也許發佈一些你的看法或嘗試基於這個小提琴repro:http://jsfiddle.net/rniemeyer/FDZJx/ –

+0

@RPNiemeyer:發佈你的答案作爲答案,所以我可以接受它,好嗎?感謝您對此的幫助。 –

回答

1

從您發佈的代碼看起來很好。也許發佈一些你的看法或嘗試基於這個小提琴repro:http://jsfiddle.net/rniemeyer/FDZJx

更新:使用你的看法:http://jsfiddle.net/rniemeyer/FDZJx/2/。依然看起來很好。你的第一個輸入元素沒有關閉,但它並沒有引起我的問​​題。可能會導致您正在使用的瀏覽器出現問題。

相關問題