1

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

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

4

1 回答 1

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
    });
};
于 2013-08-21T14:31:05.857 回答