這個頁面的想法是,我有一個文本字段,當你輸入三個或更多字符時,觸發一個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>
從您發佈的代碼看起來很好。也許發佈一些你的看法或嘗試基於這個小提琴repro:http://jsfiddle.net/rniemeyer/FDZJx/ –
@RPNiemeyer:發佈你的答案作爲答案,所以我可以接受它,好嗎?感謝您對此的幫助。 –