【发布时间】:2013-10-22 23:30:19
【问题描述】:
在我的一个视图模型中,我有一个函数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),以便它创建的对象将具有视图模型范围。只有当视图模型处于活动状态时它们才会存在,当我在 deactivate 方法中将它们从 observableArray 中删除时丢弃它们?
【问题讨论】:
-
检查是否开启了 cacheViews: true。虚拟机返回一个单例,因此使用 cacheViews: true 视图将永远不会被删除。
-
我尝试添加
cacheViews: false,但它仍然是相同的行为。问题是在function Control()中创建的对象的范围。现在创建的对象的范围是全局的。我不知道如何重写函数,所以对象的范围只能是视图模型。 -
你能复制下面的例子并重现这种行为吗?
-
很奇怪。我在函数 Control 的开头放了一个
console.log(this),它打印了一个对象Control {}。我也把它放在函数的末尾,它返回了全局对象Window {...}。 -
dfiddle.github.io/dFiddle-2.0/#extras/scope (github.com/dFiddle/dFiddle-2.0/blob/gh-pages/app/extras/scope/…) 正在使用上面的原始代码,但我没有看到任何关于 global 的内容。你能重现它吗?
标签: javascript mvvm durandal