Control
ビューモデルの 1 つに、後でビューにバインドするオブジェクトを作成する関数があります。
(コードは私のビューモデルを再現しているだけなので、不完全であるか、いくつかの間違いを含んでいる可能性があります。詳細が必要な場合は、以下のコメントで質問してください。例は durandaljs フレームワークを参照しているため、JsFiddle を提供できません。)
function Control ( value ) {
var self = this;
self.param = value;
self.param1 = ko.observable(value.text());
self.param2 = ko.computed(function() {
read: function(){
return getString(self.param.text()).StringValue();
},
write: function(newValue){
stringsArray.push(
{StringID: ko.observable(-1), StringValue: ko.observable(newValue)});
self.param.text(-1);
},
owner: self
});
self.param3 = ko.computed(function() {
return self.param2() + ' something_else';
});
self.param1.subscribe(function( newValue ) {
if ( newValue ) {
self.param3(newValue + 'text');
}
});
}
var controls = ko.observableArray([
new Control({id: 1, text: ko.observable(2)}),
new Control({id: 2, text: ko.observable(4)}),
new Control({id: 2, text: ko.observable(1)})
]);
var stringsArray = ko.observableArray([
{StringID: ko.observable(1), StringValue: ko.observable('aaa')},
{StringID: ko.observable(2), StringValue: ko.observable('bbb')}
{StringID: ko.observable(3), StringValue: ko.observable('ccc')}
{StringID: ko.observable(4), StringValue: ko.observable('ddd')}
{StringID: ko.observable(5), StringValue: ko.observable('eee')}
{StringID: ko.observable(6), StringValue: ko.observable('fff')}
]); // data retrieved from the database
var deactivate = function() {
controls.removeAll();
stringsArray.removeAll();
};
var vm = {
deactivate: deactivate,
controls: controls,
stringsArray: stringsArray
};
return vm;
function getString ( stringID ) {
for ( var i = 0; i < stringsArray().length; i++ ) {
if ( stringsArray()[i].StringID() === stringID ) {
return stringsArray()[i];
}
}
return undefined;
}
私の問題は、関数から作成されたオブジェクトがグローバルにスコープされているため、ビューモデルを非アクティブ化してもメモリ内に存在することです。
function Control(value)
作成するオブジェクトがviewmodelスコープを持つように、どのように書き直す必要がありますか。deactivate
ビューモデルがアクティブな場合にのみ存在し、メソッドのobservableArrayから削除すると破棄されますか?