据说,我的 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);
它适用于每一页。我现在的问题是,我只是不明白这个时间问题是从哪里来的。