我以为我有这个工作,但我想我第一次尝试快速数据库查找时很幸运。第二个返回更多数据并失败。
因此。简单设置是视图和视图模型。我们称之为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“activate”方法会因为我有一个停止点而触发。 datacontext中的下一个停止点也被命中,但是它出错了。在我的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”中,一旦datacontext“getCustomers”完成就应该被触发,在我放置“querySucceeded”的停止点之前命中。
我在设置中做错了吗?从逻辑上讲,它对我来说似乎是正确的,但显然我还没有快速了解Durandal中的承诺是如何工作/解决的,而且从我的观点来看,事情正在以一种意想不到的顺序发生!我期望返回的所有数据,它只是在subview1中调用“getCustomerList”之后发生的,这是我需要对象的所以我可以处理它。在处理运行时,对象中没有任何东西,所以我什么都没有显示。
答案 0 :(得分:1)
如果您希望激活主视图以等待子视图'activate
功能完成,请从主getCustomers
函数返回承诺。
例如,
//in view1.js
var activate = function () {
return $.when(
subview1.activate(), //set up customers
subview2.activate() //set up products
).then(function(){
//do some other datacontext calls for stuff used directly and only in view1
});
};