让我们说我有以下简化和通用视图模型,它使用KnockoutJS和Knockout Validation library分别创建/操作和验证observable。
// view declared
// KnockoutJS loaded
// KnockoutValidation loaded
var ChildNodePropertiesVM = function(properties) {
var self = this;
/* data within properties object are assigned to
observables within VM */
};
var ChildNode = function() {
var self = this;
var options = // data from ajax request sent to web service
// list of POJOs
this.availableParentNodes = ko.observableArray();
// a specific POJO from the list above, selected from an HTML select element
// Knockout Validation ensures that a value is present (required)
this.associatedParentNode = ko.observable().extend({
required: {
params: true,
message: "Please choose a parent"
}
});
// a view model, declared above, constructed with value from options
this.childProperties = new ChildNodePropertiesVM(options.childProps);
/* Many more model-members follow, and may be any of the above types
(observable, observableArray, view model, etc) */
};
// apply bindings to view here (in this case, ko.applyBindingsWithValidation)
我感兴趣的是,如果我想创建一个“重置”程序来清除视图模型的大多数成员(其中可能有很多),并保留少数字段,因为它们是,我能做到的最可维护的方式是什么?更具体地说,将availableParentNodes
对象视为我想要保留的可观察对象之一,而associatedParentNode
必须被清除(如self.associatedParentNode(undefined)
),并且一半(未声明的)childProperties
的模型成员必须设置为null,作为重置过程的一部分。
SO和搜索引擎查询建议手动清除每个observable /变量,或者只创建一个新视图模型(在本例中为ChildNode
视图模型)来替换旧视图模型。由于我有特定的字段,我想保留,后者不是一个选项,因为这些模型中有很多可观察的,前者是不可维护的。
答案 0 :(得分:5)
一个选项是创建一个通用的重置函数,其中包含您想要保留的可观察对象的白名单参数。以下是一个示例(如果您需要支持过时的浏览器,则填充indexOf
):
var reset = function ( obj, whitelist ) {
for ( var prop in obj ) {
if ( obj.hasOwnProperty( prop ) && ko.isObservable( obj[ prop ] ) && whitelist.indexOf( prop ) === -1 ) {
obj[ prop ]( undefined );
}
}
};
然后,您可以在个别型号上使用白名单来理解此功能。
SomeModel.prototype.reset = function () {
reset( this, [ 'something', 'somethingElse' ] );
};
除了模型中名为something
和somethingElse
的{{1}}之外,上面会将每个可观察对象设置为undefined
。
答案 1 :(得分:0)
这可以通过创建函数
以一种简单的方式完成self.Reset = function(){
self.someobservable(null)
self.someobservbleArray([])
}
现在简单地称之为
self.Reset()
值将被重置。