В одной из моих моделей просмотра у меня есть функция Control
, которая позже создает объекты для привязки к представлению:
(Код воспроизводит только мою модель просмотра, поэтому он может быть неполным или содержать некоторые ошибки. Если вам нужна дополнительная информация, спросите в комментарии ниже. Поскольку пример относится к структуре 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)
, чтобы создаваемые им объекты имели область видимости. Они будут существовать только тогда, когда модель просмотра активна и отброшены, когда я удалю их из observableArray в методе deactivate
?
cacheViews: false
, но поведение осталось прежним. Проблема заключается в определении области действия объекта, созданного вfunction Control()
. Прямо сейчас область действия созданного объекта глобальна. Я не знаю, как мне переписать функцию, чтобы областью объектов была только модель просмотра. - person Razvan   schedule 15.10.2013console.log(this)
только в начале функции Control, и она напечатала объектControl {}
. Я также поместил его в конец функции, и он вернул глобальный объектWindow {...}
. - person Razvan   schedule 15.10.2013stringsArray
передcontrols
.stringsArray
не определено, когда вы вызываете new Control (), поэтому это не удается. - person RainerAtSpirit   schedule 15.10.2013StringsArray
не является неопределенным. Когда я повторно перехожу к представлению, я создаю элемент управления с разными свойствами и получаю разные строки. Ошибка возникает не из-за созданных мной новых вычислений, а из-за того, что я создал в прошлый раз, когда был на странице. Есть ли шанс, что нокаут может не уничтожить вычисленные значения, поскольку он зависит отstringsArray
, а массив строк все еще находится в памяти? - person Razvan   schedule 15.10.2013stringsArray.removeAll();
из методаdeactivate
, чтобы иметь возможность уходить от виртуальной машины. В противном случае вычисленное значение выдавало ошибку при вызове метода deactivate. - person Razvan   schedule 15.10.2013deactivate
есть вызовstringsArray.removeAll()
. Пожалуйста, вернитесь, когда у вас будет пример, который работает и показывает проблему, которую вы видите. На данный момент слишком много движущихся частей. - person RainerAtSpirit   schedule 15.10.2013for(var i=0;i<controls.peek().lenght;i++) {controls.peek()[i].param3.dispose(); controls.peek()[i].param3.dispose();}
, у меня больше нет проблемы. Спасибо большое за вашу помощь! - person Razvan   schedule 15.10.2013