2012-12-14 25 views
2

我有javascript代码块和html像下面。模型对象是通用的。 它在运行时定义。如何清除knockout中的可观察属性?

它可以是这样的。

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> 

我点击添加按钮,然后我点击sometings输入,然后我点击保存按钮。 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;} 
} 

实体类的COUTN尚不清楚。

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

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

用于测试2页:

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

var model = <%= ViewModelCreator.Create ()%>;这是否创建了上面的确切代码?因为这是你的问题,ko.mapping将使用相同的观察值,这就是为什么值不会回到默认值 – Anders

回答

8

编辑:您的视图模型是有点怪,具有内在的模型,是一个静态参考同一观测,映射插件将当他们发现它们时重用旧的可观察物。为什么你甚至可以像这样映射到一个静态定义的observables集合,为什么不直接声明你的viewmodel呢?

旧回答 能做到吗?

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

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

+0

我编辑了我的问题。 – sinanakyazici

+0

查看我对您的问题的评论 – Anders

+0

只是一个音符 - 第2行的语法错误,错过了一个右括号!感谢代码,对我的情况也非常有帮助。 –

0

你的代码有一些设计上的问题。 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/

+0

我不能这样使用。我编辑了我的问题。 – sinanakyazici

5

你要清楚的observales的值,如:

self.propertyName(''); 

例子:

self.XID(''); 
+0

不!如果你这样做的话。propertyName的( '');你是invocking基因敲除可观察的方法。 要清除它,你必须像这样重新定义它self.propertyName =“”; –

+3

是的!!!除非你想完全清理它,但只需清空它。 – Eirinn

相关问题