【发布时间】:2014-01-10 13:10:50
【问题描述】:
我正在关注 John Papa 关于 SPA 的快速入门课程,并尝试显示通过 ASP.NET Web API 加载的客户列表,但淘汰赛 foreach 绑定不起作用。 Web API 工作正常,我自己测试过它并返回正确的 JSON,因此我不会发布它的代码。 get 方法只返回一个对象数组,每个对象都具有 Name 和 Email 属性。虽然不是一个好的做法,但通过在 durandal 之前加载,淘汰赛会在全球公开为 ko。
我将customers.js 视图模型编码如下
define(['services/dataservice'], function(ds) {
var initialized = false;
var customers = ko.observableArray();
var refresh = function() {
return dataservice.getCustomers(customers);
};
var activate = function() {
if (initialized) return;
initialized = true;
return refresh();
};
var customersVM = {
customers: customers,
activate: activate,
refresh: refresh
};
return customersVM;
});
我编写的数据服务模块如下(我没有在函数queryFailed下面写,因为我知道它没有被使用)
define(['../model'], function (model) {
var getCustomers = function (customersObservable) {
customersObservable([]);
var options = {url: '/api/customers', type: 'GET', dataType: 'json'};
return $.ajax(options).then(querySucceeded).fail(queryFailed);
function querySucceeded(data) {
var customers = [];
data.forEach(function (item) {
var c = new model.Customer(item);
customers.push(c);
});
customersObservable(customers);
}
};
return {
getCustomers: getCustomers
};
});
最终模型模块构建如下:
define(function () {
var Customer = function (dto) {
return mapToObservable(dto);
};
var model = {
Customer: Customer
};
return model;
function mapToObservable(dto) {
var mapped = {};
for (prop in dto)
{
if (dto.hasOwnProperty(prop))
{
mapped[prop] = ko.observable(dto[prop]);
}
}
return mapped;
}
});
视图只是一个列表,它只是:
<ul data-bind="foreach: customers">
<li data-bind="text: Name"></li>
</ul>
但这不起作用。任何其他绑定都有效,我查看了控制台窗口,似乎可观察数组已正确填充。唯一的问题是这段代码没有在屏幕上显示任何内容。我已经检查了很多次文件,但我似乎无法找到问题所在。这有什么问题?
【问题讨论】:
-
区分大小写?您在上面声明属性是名称和电子邮件,但您的绑定显示文本:名称。
-
@Brad,我在这里写错了。我也在我的代码上写了错误的案例,但即使纠正这个,它仍然不起作用。你还有别的想法吗?感谢您的帮助。
-
你记得调用applyBindings吗?
-
控制台中有任何错误信息吗?
-
你选择了一个解决方案,但你没有提到哪里出了问题
标签: javascript knockout.js durandal