我以为我有这个工作,但我想我很幸运在我第一次尝试时快速查找数据库。第二个返回更多数据并失败。
所以。简单的设置是视图和视图模型。我们称它们为 view1。
view1.js 使用 require 加载依赖的子视图 subview1 和 subview2。假设 subview1 用于显示客户列表,而 subview2 用于显示产品列表。我将这些放在单独的子视图中,因为它们将在其他需要客户列表或产品列表的页面的其他地方使用,我不想继续重新创建相同的代码。
两个子视图的结构如下:
define(['services/datacontext'], function (datacontext) {
var customerList= ko.observableArray();
var getCustomerList= function () {
var workingList = [];
//do some sorting and processing on the customerList array
//do stuff here
customerList(workingList);
};
var activate = function () {
//get customers!
return datacontext.getCustomers(customerList).then(getCustomerList());
};
var vm = {
activate: activate,
customerList: customerList,
};
return vm;
});
在主 view1.js (由 shell.js 直接调用,因此 activate 方法会自动触发)我有这个:
(我的“定义”设置中引用了两个子视图)
var activate = function () {
subview1.activate(); //set up customers
subview2.activate(); //set up products
//do some other datacontext calls for stuff used directly and only in view1
};
//other code in here...
var vm = {
activate: activate,
customerList: subview1.customerList,
productList: subview2.productList
};
在 view1.html 中,我只有标准的淘汰赛绑定,例如“foreach:customerList”等。
我的产品列表(1320 种产品)中没有任何内容,而我的客户列表(66 位客户)通常可以正常工作。如果我使用 chrome 调试并逐步执行,在我看来 subview1“激活”方法可以正常触发,因为我在那里有一个停止点。datacontext 中的下一个停止点也被命中,但随后出错。在我的数据上下文查询中,我有这个:
var getCustomers = function (customersObservable, forceRemote) {
if (!forceRemote) {
var p = getLocal('Customers', orderBy.customer);
if (p.length > 0) {
customersObservable(p);
//resolves the promise created when calling getCustomers
return Q.resolve();
}
}
var query = EntityQuery.from('customer')
.orderBy(orderBy.customer);
return manager.executeQuery(query)
.then(querySucceeded)
.fail(queryFailed);
function querySucceeded(data) {
if (groupsObservable) {
groupsObservable(data.results);
}
log('Retrieved customers from remote data source',
data, true);
}
};
问题似乎是承诺解决得太早了。我在 subview1 “getCustomerList” 中的停止点应该在数据上下文“getCustomers”完成后被触发,然后在我放置在“querySucceeded”上的停止点之前被击中。
我在设置中做错了吗?从逻辑上讲,这对我来说似乎是正确的,但显然我还没有跟上在 Durandal 中承诺如何工作/解决的速度,从我的角度来看,有些事情正在以意想不到的顺序发生!我期望的所有数据都会返回,它只是在 subview1 中调用“getCustomerList”之后发生,这是我需要对象的地方,以便我可以处理它。在处理运行时,对象中没有任何内容,因此我没有显示任何内容。