通过访问Ember.ArrayController获取话语中徽章的列表

Get list of badges in Discourse by accessing Ember.ArrayController from javascript outside of handlebars template

本文关键字:徽章 列表 话语 获取 访问 Ember ArrayController      更新时间:2024-01-21

在Ember.js中,我知道我可以使用Ember.ArrayController访问特定的数据集合,比如来自Ember网站的示例:

MyApp.listController = Ember.ArrayController.create();
$.get('people.json', function(data) {
  MyApp.listController.set('model', data);
});

并在车把上访问它,如下所示:

{{#each person in MyApp.listController}}
  {{person.firstName}} {{person.lastName}}
{{/each}}

不过,我想做的是在javascript中访问this?更具体地说,在话语中,为用户获取徽章。user-badges.js.es6控制器:

export default Ember.ArrayController.extend({
  sortProperties: ['badge.badge_type.sort_order', 'badge.name'],
  orderBy: function(ub1, ub2){
    var sr1 = ub1.get('badge.badge_type.sort_order');
    var sr2 = ub2.get('badge.badge_type.sort_order');

    if(sr1 > sr2) {
      return -1;
    }
    if(sr2 > sr1) {
      return 1;
    }
    return ub1.get('badge.name') < ub2.get('badge.name') ? -1 : 1;
  }
});

如何获取用户的徽章列表?调用Discourse.UsersBadges ArrayController似乎不起作用。

   import UserBadges from 'discourse/controllers/user-badges';
   for(var badge in UserBadges){
      console.log(badge);
   }

我不确定我是否在理解EmberJS应该如何工作或话语设计如何工作时遇到了问题。

我发现我以错误的方式处理这个问题,我应该使用一个promise来获得这样的用户徽章:

Discourse.UserBadge.findByUsername(Discourse.User.current().username).then(function(result) {
      result.forEach(function(entry) {
          console.log(entry.badge.name);
      }
   );
});

不过,现在我遇到了一个新问题,需要在加载视图之前加载此信息。promise是异步执行的,不会及时加载数据。