基于this.store.find()设置控制器属性的Ember方式

时间:2014-09-28 06:30:37

标签: ember.js controller ember-data

我正在设置一个页面,我的用户可以在其中添加orgLanguage,如果这是第一个添加的orgLanguage,我想要显示特殊消息。我能够让我的代码正常工作,但它确实看起来很难看,而且我想知道是否有更好的方法来处理这个问题?

首先,这是我的Handelbars模板:

把手模板(简体):

{{#if isFirstOrgLanguage}}
...display some content
{{/if}}

该变量在我的控制器上定义如下。

控制器(简体):

export default  Ember.ObjectController.extend({

    isFirstOrgLanguage: function() {
        // the 'orgLanguages' controller property is set in the route
        var orgLanguagesPromiseArray = this.get('orgLanguages');

        return orgLanguagesPromiseArray.then( function() {
            var orgLanguagesRecordArray = orgLanguagesPromiseArray.get('content');
            var orgLanguagesArray = orgLanguagesRecordArray.get('content');
            return orgLanguagesArray ? orgLanguagesArray.length === 1 : true;
        });
    }.property('orgLanguages')

}

我已将变量命名为我收到的数据类型。您将注意到这是一个计算属性,它依赖于我的路由上设置的控制器属性,如下所示。

路线(简化):

setupController: function (controller, model) {
    this._super(controller, model);
    controller.set('orgLanguages', this.store.find('org-language') );
},

最后,如果isFirstOrgLanguage为真,我想在此Handlebars模板上调用一些基本的jQuery,所以我按如下方式设置我的视图。

查看:

export default Ember.View.extend({

    didInsertElement: function() {
        this.get('controller').get('isFirstOrgLanguage').then( function( isFirstOrgLanguage ) {
            console.log('isFirstOrgLanguage', isFirstOrgLanguage);
        });
    }

});

这似乎是一个疯狂的承诺和异步管理只是为了回答这个问题"是否正好定义了1个orgLanguage"?虽然上面的工作,有一个更简单的方法,或者可能" Ember Way"这样做?

更新 在做一些额外的研究时,似乎这是一个争论的话题。以下是我在此看到的相关讨论。如果我确定我喜欢的模式,我会将其作为答案发布,但欢迎其他建议。

1 个答案:

答案 0 :(得分:2)

我想发布我最终如何解决这个问题。

首先,很明显有这种模式的推荐解决方案,但没有"一种真正的方式"。请参阅http://discuss.emberjs.com/t/the-right-way-to-load-additional-models-to-build-filtering-checkboxes/4966/4

我最终使用的是:

<强>路线:

...
afterModel: function() {
  var _this = this;

  Ember.RSVP.hash({
      languages: this.store.find('language'),
      orgLanguages: this.store.find('org-language')
  }).then( function( hash ) {
      _this.set('controller.languages', hash.languages );
      _this.set('controller.orgLanguages', hash.orgLanguages );
  });
},
...

这里的主要见解是:

  1. 在页面的模型加载后完成。根据您的具体情况,这可能有意义也可能没有意义。
  2. 有些人喜欢将每个模型包装在自己的控制器中,但是我没有对这样的控制器进行干净的映射,所以我直接设置了这些属性值。
  3. 设置承诺的计算属性通常是不好的做法,因此如果您必须处理承诺(使用this.store.find()进行承诺,那么最好解决路线中的承诺然后将具体的#34;属性传递给您的控制器。但请记住,当他们最终解决时,您的模板将呈现这些值!所以,再次出现是一个辩论的空间。
  4. 我认为一般的看法是Ember为您提供了很多选择,并根据您的需求提供了大量的使用方法。