2012-12-14 26 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

相關問題