从属性调用服务方法

时间:2015-12-18 18:31:52

标签: ember.js methods service properties

我在控制台中收到错误,说在尝试在控制器上的属性中调用服务方法时未定义服务。

[assembly: AssemblyInformationalVersion("7.1.0.0 Private (Debug build)")]

错误状态

itemImage: function(){
    return this.get('s3').getItemImage(this.get('user.active_auction'),this.get('model.item_image'));
}.property(),

该方法应该转到s3,得到一个项目。

Uncaught ReferenceError: s3 is not defined

我该怎么做才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

如果s3确实是一项服务。你需要将它注入你的控制器。

import Ember from 'ember';
const { inject, computed } = Ember;
export default Ember.Controller.extend({
  s3: inject.service(),
  itemImage: computed(function(){
    return this.get('s3').getItemImage(this.get('user.active_auction'),this.get('model.item_image'));
}.property(),  
});

现在,如果我理解你要做的事情......那个s3服务似乎正在做一些回复承诺的电话。据我所知,计算属性返回一个承诺并不是一个好的策略。 Reference

现在我认为你可以做这样的事情(如果你需要的东西可以通过一个动作或其他东西开始(例如对于一个名为someAction的动作的下面的例子):

import Ember from 'ember';
const { inject, computed } = Ember;
export default Ember.Controller.extend({
  s3: inject.service(),
  image: null,
  itemImage: computed('image', function() {
    return this.get('image');
  }),

  actions: {
    someAction() {
        let self = this;
        this.get('s3').getObject({Bucket: self.get('bucketName'),Key: auction_id+'/'+image},function(err,data){
        if (err) {
          console.log(err, err.stack);
        } else {
          self.set('image', data);
        }
      })
    }
  }

这样,当s3服务解析对象时,它将image属性设置为s3对象返回的值。由于itemImage属性依赖于image属性,因此每当s3对象更新image时,它也会更新您可以在模板中使用的计算属性。

希望我帮助过。如果我明白你想做什么,不是100%确定。