Knockout.js 如何清除淘汰中的可观察属性?

Knockout.js 如何清除淘汰中的可观察属性?,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我有如下javascript代码块和html。模型对象是泛型对象。 它是在运行时定义的 可以是这样 var model = { "xId": ko.observable(0), "xName": ko.observable(null), "Type": ko.observable("x") }; /* var model = { "yId": ko.observable(0), "yName": ko.observable(null), "Type": ko.observable("y")

我有如下javascript代码块和html。模型对象是泛型对象。 它是在运行时定义的

可以是这样

var model = { "xId": ko.observable(0), "xName": ko.observable(null), "Type": ko.observable("x") };
   /* var model = { "yId": ko.observable(0), "yName": ko.observable(null), "Type": ko.observable("y") };
    var model = { "zId": ko.observable(0), "zName": ko.observable(null), "Type": ko.observable("z") };  */

    var vm = function (data) {
        ko.mapping.fromJS(data, {}, this);
    };

    var vm2 = function () {
        var self = this;
        self.New = ko.observable(null);
        self.NewItem = function () {
            console.log(model);
            self.New(new vm(model));
        };
    };

    var viewModel = new vm2();
    ko.applyBindings(viewModel);

    vm.prototype.Save = function () {
        viewModel.New(null);
        /*In here all of inputs must be cleared but How to :)*/
    };
第一个模型的新形式

<input type="button" data-bind="click: NewItem" value="Add" />
<div data-bind="with:New" id="newForm">
    <input type="text" data-bind="value:xId" />
    <input type="text" data-bind="value:xName" />
    <input type="text" data-bind="value:Type" />
    <input type="button" data-bind="click: Save" value="Save" />
</div>
实体类的范围不清楚

我的实体类转换为json。该模型是由.net创建的,如下所示。 我的项目有母版页和子页。 对于测试页:

var model = <%=ViewModelCreator.Create<Test>() %>;
var模型=;
对于test2页面:

var model = <%=ViewModelCreator.Create<Test2>() %>;
var模型=;

编辑:您的viewmodel有点奇怪,因为内部模型是对相同观测值的静态引用,映射插件在找到旧观测值时将重用它们。为什么要这样映射到一个静态定义的可观察对象集合,为什么不直接声明viewmodel呢

旧答案 你能做到吗

for(var index in vm) {
   if(ko.isObservable(vm[index])) {
      vm[index](null);
   }
}

编辑:您还可以创建一个可清除的特殊可观察对象

您的代码存在一些设计问题<代码>模型对象已经包含可观察对象,所以您不需要使用映射插件来转换它们。我建议按如下方式更新您的代码:

function vm(){
    var self = this;

    self.xId = ko.observable(0);
    self.xName = ko.observable(null);
    self.Type = ko.observable("x");    
}

var vm2 = function() {
    var self = this;
    self.New = ko.observable(null);
    self.NewItem = function() {
        self.New(new vm());
    };
};

var viewModel = new vm2();
ko.applyBindings(viewModel);

vm.prototype.Save = function() {
    viewModel.New(null);
};

这里是工作小提琴:

您必须清除观察值,如:

self.propertyName('');
例如:

self.XID('');

var模型=;这是否创建了上面的确切代码?因为这是您的问题,ko.mapping将使用相同的observable,这就是为什么该值不会返回默认值查看我对您的问题的评论只是第2行的注释-语法错误,缺少一个右括号!谢谢你的代码,对我的情况也很有帮助。不!!!如果您这样做self.propertyName(“”);您正在调用淘汰可观察方法。要清除它,您必须像这样重新定义它。propertyName=“”;
self.XID('');