【问题标题】:How to clear observable properties in knockout?如何清除淘汰赛中的可观察属性?
【发布时间】:2012-12-02 06:20:23
【问题描述】:

我有如下的 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 :)*/
    };

第一个模型的 newForm。

<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>

我单击添加按钮,然后将某些内容输入到输入中,然后单击保存按钮。 newForm 是不可见的。到目前为止一切正常。但是我再次点击添加按钮,我已经写好的值还在输入中。保存后我无法清除 newForm。

编辑:

public class Test{
    public int TestId {get; set;}
    public int TestName {get; set;}
}

public class Test2{
    public int Test2Id {get; set;}
    public int Test2Name {get; set;}
}

实体类的数量不清楚。

我的实体类是转换为 json。该模型是由 .net 像这样创建的。 我的项目有一个母版页和子页。 测试页面:

var model = <%=ViewModelCreator.Create<Test>() %>;

对于 test2 页面:

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

【问题讨论】:

  • var model = () %>;这会创建上面的确切代码吗?因为那是你的问题,ko.mapping 将使用相同的 observable,这就是为什么 teh 值不会恢复为默认值

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

edit:您的视图模型有点奇怪,因为内部模型是对相同可观察对象的静态引用,映射插件将在找到旧可观察对象时重用它们。为什么你还要像这样映射到一个静态定义的 observables 集合,为什么不直接显式声明你的 viewmodel?

旧答案 可以吗?

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

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

【讨论】:

  • 查看我对您问题的评论
  • 请注意 - 第 2 行出现语法错误,缺少右括号!感谢您的代码,对我的情况也很有帮助。
【解决方案2】:

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

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

这是工作小提琴:http://jsfiddle.net/3uhN7/

【讨论】:

    【解决方案3】:

    您必须清除观察值的值,例如:

    self.propertyName('');
    

    例子:

    self.XID('');
    

    【讨论】:

    • 不!如果你这样做 self.propertyName('');您正在调用淘汰赛可观察方法。要清除它,您必须像这样重新定义它 self.propertyName = "";
    猜你喜欢
    • 2015-03-20
    • 2016-10-14
    • 2014-11-05
    • 2012-09-08
    • 2012-07-07
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多