У меня есть, предположительно, проблема времени с моим видовым дюрандалом (v1.2).Durandal widget timing issue
Виджет используется для нескольких видов, и это идеально подходит для первого взгляда.
все остальные виды остаются отключенными и компанией(). Длина остается 0. код выполнен на каждом представлении, аакс-вызовы завершены успешно, datacontext удаляет запрос. Метод suuccess и заполняет пройденный наблюдаемый массив.
вложение виджета:
<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;
});
т у него есть какой-то странный выглядящий код, я не очень доволен (возврат, обертывание в наблюдаемом и т. д.), но это позволило мне пройти в наблюдаемом (т. 'selectedCompanyId'), присвойте значение и получите уведомление в viewModel текущего представления без использования pub/sub.
DataContext вызов:
//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);
он работает на каждой странице. моя проблема в том, что я просто не могу понять, откуда эта проблема времени.
Что значит, что это не работает? Что не работает? Также вы получаете компании внутри конструктора, понимаете ли вы это, или было бы лучше передать их в конструктор или выполнить их после завершения построения объекта? –
как я уже упоминал: для всех просмотров после первого, компании(). Длина остается 0, поэтому выпадающий список отключен. есть ли что-то неправильное в вызове функции datacontext в ctor? –
У вас есть переходный набор для композиции вашего вида, попробуйте удалить это. (переход: 'entrence') –