ビューに移動するたびに更新する必要があるドロップダウン リストを持つウィジェットがあります。ウィジェットが使用されるたびに呼び出される、ウィジェットのビューモデルで使用できるコールバックはありますか? 通常のビューモデルのアクティブ化コールバックとまったく同じように動作するもの。
ウィジェットの activate 関数は、親ビューがロードされるたびに呼び出されるわけではありません:
ctor.prototype.activate = function (settings) {
this.settings = settings;
};
ただし、ビューが呼び出されるたびに、親ビューモデルの activate 関数が呼び出されます。
var activate = function (routeData) {
var id = parseInt(routeData);
return datacontext.getEntityByID('ProductionRun', id, productionRun)
.then(loadProducts)
.fail(queryFailed);
};
loadProducts に関するロジックを親ビューモデルからウィジェットのビューモデルに移動し、ウィジェットのビューで、親のビューモデルではなく、ウィジェットのビューモデルのコレクションを使用したいと考えています。から変更する:
<select data-bind="options: $parent.products, optionsText: 'name', optionsValue: 'productID', value: settings.productionRun().productID"></select>
に:
<select data-bind="options: products, optionsText: 'name', optionsValue: 'productID', value: settings.productionRun().productID"></select>
ありがとう
====== 2013 年 10 月 29 日の更新 ======
App/widgets/productionRunDetails/viewmodel.js のコードは次のとおりです。
define([
'durandal/app',
'durandal/composition',
'messaging',
'services/datacontext',
'services/datacontext.product'
], function (app, composition, messaging, datacontext, datacontext_product) {
function myObject() {
var productionRunStatuses = ko.observableArray(datacontext.lookups.productionRunStatuses);
var isSaving = ko.observable(false);
var hasChanges = ko.computed(function () {
return datacontext.hasChanges();
});
var canSave = ko.computed(function () {
return hasChanges() && !isSaving();
});
var saveProductionRunDetailsCommand = function () {
isSaving(true);
return datacontext.saveChanges().fin(complete);
function complete() {
isSaving(false);
app.trigger(messaging.messages.productionRunDetailsWidget_saved, this);
}
}
var cancelProductionRunDetailsCommand = function () {
datacontext.cancelChanges();
}
var closeProductionRunDetailsCommand = function () {
datacontext.cancelChanges();
}
var self = this;
self.canSave = canSave;
self.productionRunStatuses = productionRunStatuses;
self.saveProductionRunDetailsCommand = saveProductionRunDetailsCommand;
self.cancelProductionRunDetailsCommand = cancelProductionRunDetailsCommand;
self.closeProductionRunDetailsCommand = closeProductionRunDetailsCommand;
}
myObject.prototype.activate = function (settings) {
this.settings = settings; //This gets called once, during the whole life cycle of the widget
};
//myObject.prototype = (function () {
// var activate = function () {
// };
// return {
// activate: activate
// }
//})(); // As soon as I add this code (myObject.prototype), the widget does not work.
var myObj = new myObject();
return myObj;
});
ウィジェットは、親ビューで次のように実装されています。
<div data-bind="widget: {kind:'productionRunDetails', productionRun:productionRun}"></div>
親ビューからウィジェットに productionRun という ko オブザーバブルを渡しています (ビューモデル内の設定パラメーターで使用できます)。親ビューモデルに読み込まれるウィジェットにドロップダウン リストがあります。ロード操作を親ビューモデルからウィジェットのビューモデルに移動し、バインディングを次のように変更したいと思います。
<select data-bind="options: $parent.products, etc
に:
<select data-bind="options: products
しかし、それを行うには、(親ビューに移動することによって) 親ビューモデルがアクティブになるたびに実行される activate コールバックが必要です。
これは可能ですか?ウィジェットの作成に関するデュランダルの例に従いましたが、アクティブ化コールバックは 1 回だけ呼び出されます ( http://durandaljs.com/documentation/Creating-A-Widget/ )。ホットタオル+デュランダル+ブリーズ初心者です。ありがとうございました。