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;
});
これには、私があまり満足していない奇妙に見えるコードがいくつかあります (戻り値、オブザーバブルでの設定のラップなど)。 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);
すべてのページで機能します。私の問題は、このタイミングの問題がどこから来ているのか理解できないということです。