2013-02-06 21 views
0

我想用新數據重新綁定相同的模型,或者您可以在調用ajax後說我想用全部新數據更新模型。如何在淘汰賽中重新綁定相同的視圖模型

function returnData(url,data,type){ 
    $.post(url, data, function(returnedData) { 

    if(type == "search") 
    { 
    ko.applyBindings(new SearchViewModel(returnedData,"#searchbox",url,data),$("#searchbox")[0]); 
    } 
}); 
} 

這是爲數據調用ajax的代碼,當新的數據被接收時,它將它綁定到模型。 第一次不是問題,但下次它將相同的數據加倍。

returnData(doamin+"/1.0/search",{userid:"12033914132",keyword:""},"search"); 

我想在輸入新的搜索詞時調用相同的函數。

我知道,我們可以用觀察到的更新數據,但我想清除舊的綁定,並添加新的

function SearchViewModel(data,id,url,userdata) { 
    var self = this; 
    // Editable data 

    var ParsedData = JSON.parse(data); 

    self.Contacts = ko.observableArray(ParsedData.Contacts); 
    self.Sms = ko.observableArray(ParsedData.Sms); 
    self.Calendar = ko.observableArray(ParsedData.Calendar); 
    self.Logs = ko.observableArray(ParsedData.Logs); 
    self.Total = ko.toJS(self.Contacts).length+ko.toJS(self.Sms).length+ko.toJS(self.Calendar).length; 
    self.ContactsCount = ko.toJS(self.Contacts).length; 
    self.SmsCount = ko.toJS(self.Sms).length; 
    self.CalendarCount = ko.toJS(self.Calendar).length; 
} 

回答

2

我只申請綁定一次,然後用knockout mapping plugin更新現有瀏覽模式:

function SearchViewModel() { 
    var self = this; 
    // Editable data 

    self.Contacts = ko.observableArray(); 
    self.Sms = ko.observableArray(); 
    self.Calendar = ko.observableArray(); 
    self.Logs = ko.observableArray(); 
    self.Total = ko.toJS(self.Contacts).length+ko.toJS(self.Sms).length+ko.toJS(self.Calendar).length; 
    self.ContactsCount = ko.toJS(self.Contacts).length; 
    self.SmsCount = ko.toJS(self.Sms).length; 
    self.CalendarCount = ko.toJS(self.Calendar).length;  
} 

你需要改變你的計數屬性computed observables,但一切要由映射插件被映射到:

var searchViewModel = new SearchViewModel(); 

function returnData(url,data,type){ 
    $.post(url, data, function(returnedData) { 

    if(type == "search") 
    { 
     searchViewModel = ko.mapping.fromJS(returnedData); 
    } 
}); 
} 
ko.applyBindings(new SearchViewModel(returnedData,"#searchbox",url,data),$("#searchbox")[0]); 
+0

力工作的任何別的東西我不使用映射可以做什麼? – rohitarora

+0

嘗試更新。如果它仍然不起作用,那麼你將需要擴展不起作用的東西。 –

+0

我認爲它不工作,因爲這個變量'searchViewModel = new SearchViewModel();'它無法創建這個類的對象。我仍然在問什麼沒有使用映射 – rohitarora

0

您可以將SearchViewModel存儲在可觀察對象中。有了這個,你可以更新你的SearchViewModel而不需要任何映射或重新綁定。

function ViewModel() { 
    var self = this; 

    self.searchViewModel = ko.observable(); 
} 

var viewModel = new ViewModel(); 
ko.applyBindings(viewModel, $("#searchbox")[0]); 

function returnData(url,data,type){ 
    $.post(url, data, function(returnedData) { 

    if(type == "search") 
    { 
    // ko.applyBindings(new SearchViewModel(returnedData,"#searchbox",url,data),$("#searchbox")[0]); 
     viewModel.searchViewModel(new SearchViewModel(returnedData,"#searchbox",url,data)); 
    } 
}); 
} 

查看:

<div id="#searchbox" data-bind="if: searchViewModel()"> 
    <div data-bind="with: searchViewModel()"> 
     ... your markup 
    </div>  
</div>