0

我正在尝试为 Travis-CI Mobile 加载一些最喜欢的存储库,我正在尝试将它们放在一起

我拥有的是一组存储库 ID,如下所示:

var favoriteRepos = ["668498","557554","7934","207993"];

我们如何使用 ember-data 修订版 12、Travis 自定义 RESTAdapterTravis API加载所有这些存储库?

到目前为止,这是我尝试失败的方法:

// This is in the repo model - https://github.com/floydpink/Travis-CI-www/blob/master/js/app/models/Repo.js
Repo.reopenClass({
  favorites     : function (favorites) {
    // favorites would be an array of repo-ids like  ["451069","538603"]
    var faves = Ember.ArrayProxy.create({
      isLoadedBinding : 'content.isLoaded',
      content         : Ember.A([])
    });
    favorites.forEach(function (favorite) {
      faves.pushObject(Repo.find(favorite));
    });
    return faves;
  }
});

// And in FavoritesController
this.set('content', Repo.favorites(favoriteRepos));

所以一般的问题是,我们如何使用 ember-data 按 id 加载一些不同的记录?

4

2 回答 2

4

你应该能够做到:

Repo.reopenClass({
  favorites     : function (favorites) {
    // favorites would be an array of repo-ids like  ["451069","538603"]
    return Ember.ArrayProxy.createWithMixins({
      content: favorites.map(function(id) { return Repo.find(id); }),
      isLoaded: function() {
        return this.everyProperty('isLoaded');
      }.property('@each.isLoaded');
    });
  }
});
于 2013-04-09T04:28:56.053 回答
1

如果您的车把模板如下所示:

{{#if isLoaded}}
  {{#each controller}}
    ...
  {{/each}}
{{/if}}

然后它就行不通了,因为你从来没有在你的阵列上设置isLoaded过。true根据您使用的数据实现,您可以执行以下操作:

Repo.reopenClass({
  favorites: function (ids) {
    // ids would be an array of repo-ids like  ["451069","538603"]
    var loadCount = 0;
    var favorites = Em.A();
    ids.forEach(function(id) {
      var favorite = Repo.find(id);
      favorites.pushObject(favorite);
      favorites.then(function() {
        loadCount++;
        if (loadCount == ids.length) {
          favorites.set('isLoaded', true);
        }
      });
    });
    return favorites;
  }
});

isLoaded一旦从服务器加载了所有收藏夹,该属性就会设置为 true。

于 2013-04-09T05:40:36.727 回答