从可观察的淘汰赛中清除所有价值观

时间:2015-07-29 14:35:12

标签: jquery knockout.js

我正在使用knockout对模态中包含的表单进行数据绑定。一旦用户提交表单,模式就会在成功的帖子上关闭。我还想清除我的淘汰视图模型中的所有可观察值,以便用户可以打开模态并从头开始提交新表单。我不想丢失已在字段上设置的ko.observable绑定。

对于上下文,我的viewmodel是另一个视图模型的子项。

在我的父视图模型中

self.childElement = ko.observable(new childElementVm());

我的孩子视图模型

var childElementVm = function (){
    var self= this;
    self.property1 = ko.observable()
    self.property2 = ko.observable()
    self.property3 = ko.observable()
    self.property4 = ko.observable()
    self.property5 = ko.observable()
    self.property6 = ko.observable()
    self.array1 = ko.observableArray()
    self.array2 = ko.observableArray()
    self.array3 = ko.observableArray()
    self.array4 = ko.observableArray()

    //several more observables

    //a smattering of functions including some self.property.subscribe functions

    $.ajax({
         //post
    }).done(function(){
        $('#myModal').modal('hide');
        //reset all values in childElementVm
    });
}

4 个答案:

答案 0 :(得分:4)

每次创建新的视图模型可能更好。您使用Knockout来销毁和重新制作视图模型。 if绑定将添加和删除dom中的元素。如果添加的元素是Knockout组件,则会自动创建它的视图模型。

<div class="myModal">
    <-- ko if: isModalPresented -->
        <my-child-component params="myChildElementParams"></my-child-component>
    <-- /ko -->
</div>

答案 1 :(得分:1)

每次打开模态时都可以放入一个新的视图模型,所以在打开模态时可以这样做:

parentVM().childElementVm(new childElementVm());

我在评论中看到你在childElementVm中有一些订阅,所以如果你这样做,你必须将订阅存储在childElementVm中并在关闭模态时将它们处理掉。这看起来有点像这样:

//Store subscriptions
var subscriptions = [];
subscriptions.push(myViewModel.personName.subscribe(function(newValue) {
    alert("The person's new name is " + newValue);
}));

//Dispose
for(var i = 0; i < subscriptions.length; i++){
    subscriptions[i].dispose()
}

这将重置您的数据,因为每次打开您的模态时都会有一个全新的childElementVm。

答案 2 :(得分:1)

您可以使用此功能:

function resetObservables(object, defaultValue) {
    for (var key in object) {
        if (object.hasOwnProperty(key)) {
            var property = object[key];
            if(ko.isObservable(property)){
                property(defaultValue);
            }
        }
    }
}

这样:

$.ajax({
     //post
}).done(function(){
    $('#myModal').modal('hide');
    //reset all values in childElementVm
    resetObservables(self,"");
});

答案 3 :(得分:0)

清理一个可观察的只是使用:

ByteBuffer.wrap(bBuffer).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(sBuffer);