1

据说,我的 durandal (v1.2) 小部件存在时间问题。

该小部件用于多个视图,这仅适用于第一个视图。

所有其他视图保持禁用状态,company().length 保持为 0。代码在每个视图上执行,ajax 调用成功完成,datacontext 命中 querySucceeded 方法并填充传递的 observableArray。

嵌入小部件:

<div data-bind="widget: { kind: 'companypicker', companyId: selectedCompanyId }"></div>

小部件标记:

<select data-bind="options: companies, optionsText: 'displayName', optionsValue: 'id', optionsCaption: 'Choose...', value: selectedCompany, enable: companies().length > 0"></select>

<span class="loader" data-bind="css: { active: companies().length == 0 }">
    <i class="icon-spinner icon-2x icon-spin"></i>
</span>

小部件代码:

define(function (require) {
    var ctor = function (element, settings) {
        var self = this;
        self.datacontext = require('services/datacontext');
        self.settings = settings;
        self.selectedCompany = ko.observable();
        self.companies = ko.observableArray();

        self.returningCompanyId = ko.observable(settings.companyId);

        settings.companyId.subscribe(function (newValue) {
            if (!newValue) {
                self.selectedCompany(null);
            }
        });

        self.selectedCompany.subscribe(function (newValue) {
            self.returningCompanyId()(newValue);
        });

        self.datacontext.getCompanies(self.companies);

    };

    return ctor;
});

这有一些看起来很奇怪的代码,我不太满意(返回、在 observable 中包装设置等),但这使我能够传入一个 observable(即'selectedCompanyId'),分配一个值并在 viewModel 中得到通知不使用 pub/sub 的当前视图。

数据上下文调用:

//datacontext construct obviously inspired by jpapa :)
var getCompanies = function (companies) {       
    var query = entityQuery.from('CompanyOverview');

    return manager.executeQuery(query)
        .then(querySucceeded)
        .fail(queryFailed);

    function querySucceeded(data) {
        if (companies) {
            companies(data.results);
        }
        log('Successfully retrieved companies', data, true);
    }
};

但:

如果我换行

self.datacontext.getCompanies(self.companies);

进入

setTimeout(function() {
    self.datacontext.getCompanies(self.companies);
}, 5000);

它适用于每一页。我现在的问题是,我只是不明白这个时间问题是从哪里来的。

4

2 回答 2

1

数据加载调用最好放在activate. 如果async call在 Durandal 1.2 中它是一个比,那么您必须在 Durandal 2.0 中返回一个承诺,您可以选择返回一个承诺,以便 Durandal 能够正确地进行组合。

因此,假设self.datacontext.getCompanies返回一个承诺以下内容就足够了。

ctor.prototype.activate = function(){
    return self.datacontext.getCompanies(self.companies);
}

编辑正如评论中所指出的,上述内容不适用于 Durandal 1.2 中的小部件。对于 1.2 中的普通视图,您仍然必须遵循该模式。

于 2013-09-25T11:07:58.753 回答
0

您可以尝试在另一个事件中加载数据,而不是在构造函数中执行,

define(function (require) {
    var ctor = function (element, settings) {
        var self = this;
        self.datacontext = require('services/datacontext');
        self.settings = settings;
        self.selectedCompany = ko.observable();
        self.companies = ko.observableArray();

        self.returningCompanyId = ko.observable(settings.companyId);

        settings.companyId.subscribe(function (newValue) {
            if (!newValue) {
                self.selectedCompany(null);
            }
        });

        self.selectedCompany.subscribe(function (newValue) {
            self.returningCompanyId()(newValue);
        });


    };

    ctor.prototype.viewAttached=function(){
       this.datacontext.getCompanies(this.companies);
    }

    return ctor;
});

编辑..尝试像这样改变,

var getCompanies = function (companies) {       
    var query = entityQuery.from('CompanyOverview');

    return manager.executeQuery(query)



};

在小部件中,

 self.datacontext.getCompanies().then(function(data){
     if (companies) {
            companies(data.results);
        }
        log('Successfully retrieved companies', data, true);

  });
于 2013-09-25T07:10:19.073 回答