Jquery 清除observables敲除中的所有值

Jquery 清除observables敲除中的所有值,jquery,knockout.js,Jquery,Knockout.js,我正在使用knockout对包含在modal上的表单进行数据绑定。一旦用户提交表单,模式将在成功发布后关闭。我还想清除我的淘汰视图模型中的所有可观察值,这样用户就可以打开模型并从头提交一个新表单。我不想丢失字段上已经设置的ko.observable绑定 对于上下文,我的viewmodel是另一个视图模型的子视图 在我的父视图模型中 self.childElement = ko.observable(new childElementVm()); var childElementVm = func

我正在使用knockout对包含在modal上的表单进行数据绑定。一旦用户提交表单,模式将在成功发布后关闭。我还想清除我的淘汰视图模型中的所有可观察值,这样用户就可以打开模型并从头提交一个新表单。我不想丢失字段上已经设置的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
    });
}
我的孩子视图模型

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
    });
}

要清洁可观察到的物体,只需使用:

self.property1('');

要清洁可观察到的物体,只需使用:

self.property1('');

每次打开模态时,都可以放入新的viewmodel,因此在打开模态时,请执行以下操作:

parentVM().childElementVm(new 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中有一些订阅,因此,如果您执行以下操作,您必须将订阅存储在childElementVm中,并在关闭模式时将其处理掉。这看起来有点像这样:

parentVM().childElementVm(new 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()
}
//存储订阅
var订阅=[];
subscriptions.push(myViewModel.personName.Subscription)(函数(newValue){
警报(“此人的新姓名为”+newValue);
}));
//处置
对于(var i=0;i

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

每次打开模式时都可以放入一个新的viewmodel,因此打开模式时,请执行以下操作:

parentVM().childElementVm(new 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中有一些订阅,因此,如果您执行以下操作,您必须将订阅存储在childElementVm中,并在关闭模式时将其处理掉。这看起来有点像这样:

parentVM().childElementVm(new 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()
}
//存储订阅
var订阅=[];
subscriptions.push(myViewModel.personName.Subscription)(函数(newValue){
警报(“此人的新姓名为”+newValue);
}));
//处置
对于(var i=0;i

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

最好每次创建一个新的视图模型。您可以使用Knockout来销毁和重新生成视图模型。if绑定将在dom中添加和删除元素。如果添加的元素是淘汰组件,则将自动创建其视图模型

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

最好每次都创建一个新的视图模型。您可以使用Knockout来销毁和重新生成视图模型。if绑定将在dom中添加和删除元素。如果添加的元素是淘汰组件,则将自动创建其视图模型

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

您可以使用此功能:

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,"");
});

您可以使用此功能:

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,"");
});

childElementVm有多复杂?你能展示一下它的源代码吗?它并不复杂,有一些ajax调用和一些订阅,我在我的示例中添加了一些属性,但可能只有大约四分之一的可观察性show complex是
childElementVm
?你能展示它的来源吗?它并不复杂,有一些ajax调用和一些订阅,我在我的示例中添加了一些属性,但可能只有大约四分之一的可观察性。我宁愿不这样做30次,如果我不得不这样做我宁愿不这样做30次,如果我不得不这样做我会这样做