2014-02-21 45 views
5

我正尝试从服务器中将元素添加到可观察数组中。为什么我不能将数据连接到可观察数组中敲除

这里是我的ViewModel:

function ArticlesViewModel() { 
    var self    = this; 
    this.listOfReports  = ko.observableArray([]); 

    self.loadReports = function() { 
     $.get('/router.php', {type: 'getReports'}, function(data){ 
      for (var i = 0, len = data.length; i < len; i++){ 
       self.listOfReports.push(data[i]); 
      } 
     }, 'json'); 
    }; 

    self.loadReports(); 
}; 

而且它完美的作品。但我知道我可以使用concat()在JavaScript中合并两个数组,并据我所知concat works in knockout。所以当我尝试用self.listOfReports().concat(data);self.listOfReports.concat(data);替换我的循环时,屏幕上不显示任何内容。

在第一种情况下没有错误,第二个错误告诉我没有方法concat。

所以我怎么能concat数据没有我的循环。而且我会很高兴听到为什么我的方法是行不通的

+1

observableArrays不支持concat方法,这里有一个公开的问题:https://github.com/knockout/knockout/issues/786 – Tanner

+0

奇怪,因为我认为在[这个问题](http:// stackoverflow.com/q/19221174/1090562)一个人正在拼接可观察数组。所以据我了解,我采取的方法(循环和推动)是最好的? –

+0

我可能是错误的,我总是倾向于使用循环/推式方法 – Tanner

回答

10

observableArray支持concat方法。请参阅官方支持的文档array manipulation methods

但是你可以做的是调用concat底层阵列上,然后重新分配这个新的级联阵列您观察到的:

self.listOfReports(self.listOfReports().concat(data)); 

linked example作品,因为self.Products().concat(self.Products2())是在循环中使用。如果你只是写self.listOfReports().concat(data);它仍然连接,但你只是抛出结果,并不存储在任何地方,这就是为什么你需要将它存储回observableArray。

+0

这也应该包括在KO内核中。 – Nishanthan

+1

一个更有效的方法是使用像这样的推式方法: 'self.listOfReports.push.apply(self.listOfReports,data)' – csnate