Javascript 淘汰视图模型重置——当可观察对象需要默认值时

Javascript 淘汰视图模型重置——当可观察对象需要默认值时,javascript,mvvm,knockout.js,Javascript,Mvvm,Knockout.js,假设我有以下简化的通用视图模型,它分别使用KnockoutJS和来创建/操作和验证可观察对象 // view declared // KnockoutJS loaded // KnockoutValidation loaded var ChildNodePropertiesVM = function(properties) { var self = this; /* data within properties object are assigned to o

假设我有以下简化的通用视图模型,它分别使用KnockoutJS和来创建/操作和验证可观察对象

// 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)
我感兴趣的是,如果我想创建一个“重置”过程来清除视图模型的大多数成员(其中可能有很多),并保持少数字段不变,那么我可以用什么样的方式进行维护?更具体地说,考虑<代码>可用的PARTENTURNECTONE/CONT>对象是我想保留的一个观察值,而必须清除<代码>关联PARTENTRONT (如在, So.Apple PaleNo结(未定义)),并且必须将“<代码>子属性 >中的(未声明的)模型成员的一半设置为NULL,作为重置过程的一部分


因此,搜索引擎查询要么建议手动清除每个可观察/变量,要么创建一个新的视图模型(在本例中为
ChildNode
view模型)来替换旧的视图模型。因为我有我想要保留的特定字段,后者不是一个选项,而且因为这些模型中有如此多的可观察对象,前者是不可维护的。

这可以通过创建一个函数的简单方式来实现

self.Reset = function(){
    self.someobservable(null)
    self.someobservbleArray([])
}
现在就叫它

self.Reset()

这些值将被重置。

一个选项是创建一个通用重置函数,其中包含一个白名单参数,用于您希望保留的观测值。下面是一个示例(如果需要支持过时的浏览器,请使用polyfill
indexOf
):

然后你可以在你的个人模型上用你的白名单来实现这个功能

SomeModel.prototype.reset = function () {
    reset( this, [ 'something', 'somethingElse' ] );
};
上述操作会将模型中名为
something
somethingElse
的对象之外的所有可观察对象设置为
undefined


这里有一个.

Hmmm,正如我在上一段中所说,手动清除每个可观察/变量似乎不是一个很容易维护的解决方案。实际上,我的视图模型中有大约30个可观察对象/视图模型!完美--可维护且简洁。
SomeModel.prototype.reset = function () {
    reset( this, [ 'something', 'somethingElse' ] );
};