2015-12-18 74 views
1

我在控制檯中收到一條錯誤消息,說在嘗試調用控制器屬性內的服務方法時服務未定義。來自屬性的呼叫服務方法

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; 
     } 
    }) 
} 

要做到這一點,我該做些什麼?

+1

是否在getItemImage中定義了s3? – Gaurav

+0

啊,是的,但我沒有得到它,我只是認爲這是控制器對我大喊,但它確實是服務方法。 – Jordan

回答

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%肯定的。

+0

我喜歡這種方法,這裏的抓住是我需要在模板渲染上獲取圖像。我正在從'item'路由轉換到'item'路由,並希望在加載模板時加載該'item'的圖像。我想我可以使用一些'didTransition'鉤子,但事實證明我不需要這樣做,因爲S3資源可以通過直接在src'屬性中指定它們的端點來加載。但是,謝謝你的回答! – Jordan

+0

很高興我可以「幫助」,祝您好運! –