Я использую Durandal 2.1, и у меня проблема с композицией представления. У меня есть представление для управления многими типами элементов. Я также хочу, чтобы представление управляло подмножеством этих типов. Поэтому я создал представление управления и представление управления подмножеством. Представление managesubset просто составляет представление управления и передает ему массив, содержащий подмножество элементов. Таким образом, пользователь может перейти к /100/manage или 100/managesubset, где managesubset позволит пользователю управлять только подмножеством элементов. Я использую этот шаблон, потому что у меня будет несколько разных версий managesubset.
Моя проблема в том, что метод canDeactivate не запускается при переходе к managesubset. Есть ли способ запускать события жизненного цикла canDeactivate и Deactivate при составлении?
Согласно № 3 в разделе Обратные вызовы жизненного цикла активатора здесь, я должен быть в состоянии сделать это , но я не могу найти хороших примеров.
Код:
manage.js
define(['durandal/app', 'plugins/router'], function (app, router) {
var constructor = function () {
var self = this;
//...variable creation and assignment
//life cycle events
self.activate = function (viewmodel) {
self.recordId(viewmodel.recordId);
self.assignableTypes(viewmodel.assignableTypes);
self.pageHeaderTitle = viewmodel.pageHeaderTitle;
self.pageHeaderIcon = viewmodel.pageHeaderIcon;
};
self.canActivate = function (id) {
var deferred = $.Deferred();
//check if user has access to manage equipment
};
self.canDeactivate = function () {
if (!self.saveSuccessfull() && this.isDirty()) {
return app.showMessage("You have unsaved changes, are you sure you want to leave?", "Unsaved Changes", ["Yes", "No"]);
}
else {
return true;
}
}
};
return constructor;
});
managesubset.js
define([], function () {
var recordId = ko.observable();
var manageRecord = ko.observable();
return {
recordId: recordId,
manageRecord: manageRecord,
activate: function (id) {
recordId(id);
manageRecord({
pageHeaderTitle: 'Manage Subset',
pageHeaderIcon: 'cb-subset',
assignableTypes: [102],
recordId: recordId()
});
},
canActivate: function (id) {
var deferred = $.Deferred();
//check if user has access to manage equipment
}
}
});
managesubset.html
<div data-bind="compose: { model: 'manage', activationData: manageRecord() }"></div>
Активация вызывается правильно каждый раз. Деактивация и canDeactive - это то, что не работает, и они никогда не вызываются.
app.setRoot()
в файле основного модуля? - person Brett   schedule 17.06.2015