Durandal中的子视图与Breeze,承诺和激活的问题

时间:2013-08-21 11:42:40

标签: knockout.js breeze durandal

我以为我有这个工作,但我想我第一次尝试快速数据库查找时很幸运。第二个返回更多数据并失败。

因此。简单设置是视图和视图模型。我们称之为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”之后发生的,这是我需要对象的所以我可以处理它。在处理运行时,对象中没有任何东西,所以我什么都没有显示。

1 个答案:

答案 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
    });
};