为什么我的knockoutjs observableArray数据更新没有触发任何东西?
这个页面的想法是,我有一个文本字段,当您输入三个或更多字符时,它会触发 ajax 查询来搜索用户列表。该部分工作正常,并且 console.log()
调用表明我正在获取良好的数据并将其分配给我的视图模型的 .users 字段。
问题是,这不会触发任何可观察到的行为。在 HTML 中,我有一个与 foreach: users
绑定的模板,并且在 userCount
上绑定了一个 span,两者都没有更新。但是,如果我在控制台上输入 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);
编辑:刚刚将我的 ajax getting 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 Niemeyer 替换了我的视图,并且它起作用了......所以这与我的观点有关。这是我所拥有的:
<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>
The idea of this page is, I have a text field which, when you enter three or more characters, fires an ajax query to search the list of users. That part works fine, and the console.log()
call demonstrates I'm getting good data back and assigning it to the .users field of my view model.
The problem is, that doesn't trigger any of the observable behavior. Up in the HTML I have a template that is bound with foreach: users
, and I have a span bound on userCount
, neither of which update. However, if I type viewModel.users().length
on the console, I get the right value. But I've somehow broken observability.
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);
EDIT: Just modified my ajax getting dependentobservable function to:
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);
No difference at all. But I can see the properly-returned label values in the console, and again, viewModel.users().length gives me answers I'm happy with.
EDIT: I replaced my view with the one @RP Niemeyer provided in a fiddle, and it worked... SO it's something about my view. Here's what I had:
<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>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从您发布的代码看起来不错。也许发表一些你的观点或尝试根据这个小提琴进行重现: http://jsfiddle.net/rniemeyer/FDZJx< /a>
更新:使用您的视图:http://jsfiddle.net/rniemeyer/FDZJx/2/。看起来还是不错的。您的第一个输入元素未关闭,但这并没有给我带来问题。可能会导致您使用的浏览器出现问题。
Looks fine from the code you posted. Maybe post some of your view or try to repro based on this fiddle: http://jsfiddle.net/rniemeyer/FDZJx
Update: used your view: http://jsfiddle.net/rniemeyer/FDZJx/2/. Still looks fine. Your first input element was not closed, but it didn't cause me a problem. Possibly causes a problem in the browser that you are using.