【问题标题】:Call service method from a property从属性调用服务方法
【发布时间】:2015-12-18 18:31:51
【问题描述】:

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

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

错误状态

Uncaught ReferenceError: s3 is not defined

该方法应该去s3,获取一个项目。

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

我必须怎么做才能让它工作?

【问题讨论】:

  • s3 是否在 getItemImage 中定义?
  • 啊,是的,但我没有正确理解它,我只是认为是控制器对我大喊大叫,但确实是服务方法。

标签: ember.js methods service properties


【解决方案1】:

如果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 属性,每当image 被s3 对象更新时,它也会更新您可以在模板中使用的计算属性。

希望我有所帮助。不是 100% 确定我是否理解您想要做什么。

【讨论】:

  • 我喜欢这种方法,这里的问题是我需要在模板渲染中获取图像。我正在从items 路由过渡到item 路由,并希望在模板加载时加载该item 的图像。我想我可以使用一些 didTransition 钩子,但事实证明我不需要这样做,因为可以通过直接在 src 属性中指定它们的端点来加载 S3 资产。不过谢谢你的回答!
  • 很高兴我能“帮忙”,祝您的 ember 应用好运!
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 2019-02-04
  • 2016-03-09
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 2017-04-12
相关资源
最近更新 更多