2013-12-09 32 views
0

我想创建一个可选列表,其中每个列表元素都来自ajax请求。 这工作正常。但是我无法解决的问题是,选定的列表元素在更新后不会保持选中状态(新的Ajax请求)。其他一切按预期工作。 感谢您的帮助。未选中列表元素(通过ajax请求更新后)

这里是我的html代码:

<!DOCTYPE html> 
<html> 
<head>  
    <title>Sample</title> 
    <script src='/sm/scripts/jquery.js' type='text/javascript'></script> 
    <script src='/sm/scripts/knockout.js' type='text/javascript'></script> 
    <script src='/sm/scripts/knockout.mapping.js' type='text/javascript'></script> 
</head> 
<body> 
    <select data-bind="options:SiteData , selectedOptions:selectedSiteData , optionsText: 'SiteName'" size="5" multiple="true"></select> 
    <pre data-bind="text: ko.toJSON($root.selectedSiteData, null, 2)"></pre> 
    <script src='/sm/viewModel.js' type='text/javascript'></script> 
</body> 
</html> 

这里是我的viewmodel.js的代码:

function viewModel(){ 
    var self = this; 
    this.SiteData = ko.mapping.fromJSON([{}]); 
    self.selectedSiteData = ko.observableArray(); 
    this.refresh = function() { 
     $.getJSON("/sm/allsites", function(data) { 
      ko.mapping.fromJS(data, self.SiteData); 
     }); 
    }; 
    self.refresh(); 
    setInterval(self.refresh, 3000); 
}; 
ko.applyBindings(new viewModel()); 

回答

1

的问题是,selectedSiteData包括引用的对象在SiteData,突出显示由对象身份比较确定。一旦你刷新了SiteData,所有对象的身份都是全新的,即使它们中的一些包含与以前相同的数据,所以selectedSiteData中的引用没有一个与它们相等。

我想你几乎经历selectedSiteData有循环,并在SiteData每个成员的数据每个成员的数据(可能的id场)进行比较,后者取代前者是否匹配。

+0

谢谢你解释我的问题:)。我现在解决了它。我发现在映射插件中已经有了解决我的问题的解决方案。我指定我的ID为键值: 'var mapping = { key:function(data){ return ko.utils.unwrapObservable(data.idSites); } }; ko.applyBindings(new viewModel()); ' – sm1988