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

当我输入一个新的搜索词时,我想调用相同的函数。

我知道我们可以使用 observable 来更新数据,但我想清除旧绑定并添加新绑定

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

2 回答 2

2

我只会应用一次绑定,然后使用敲除映射插件来更新现有的视图模型:

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

您需要将 count 属性更改为计算的 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]);
于 2013-02-06T09:27:36.647 回答
0

您可以将 SearchViewModel 存储在 observable 中。有了它,您可以更新您的 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>
于 2013-02-08T21:27:03.877 回答