更新:无法从具有promies的服务的计算属性更新控制器的计算属性

时间:2016-01-05 15:02:47

标签: ember.js

功率选] 1。我传递给电源选择的选项来自服务。选项数组有重复值,我试图在我的控制器中删除。 我做了一个旋转,因为它直到现在还没有支持addonss(ember-power-select)。我稍微修改了一下 Ember twiddle

twiddle中的注释代码就是我在桌面上的内容。此代码适用于tweedle,但在我的计算机上不起作用。

问题:dropDown值在模板上不可见

    import Ember from 'ember';
    const {
      get,
      set,
      computed
    } = Ember;
    export default Ember.Service.extend({

      locations: computed(function(){
        var self = this;

        return get(this,'store')
            .findAll('store')
            .then(stores =>{
                let locs = stores.map(store => {
                     return get(store,'adminAreaLevel2') +" "+ get(store,'adminAreaLevel1')
            });
                set(self,'locations',locs);
          });

});

控制器中的代码是

//Controller
import Ember from 'ember';
const {
  inject: { service },
  computed: { uniq }
}=Ember;

export default Ember.Controller.extend({
   dropData: service('my-service'),
  dropLocation: uniq('dropData.locations')
});

我不能包含在旋转中的电源选择代码

{{#power-select
      options=dropLocation
      selected=selectedLoc
      matcher=locMatcher
      onchange=(action "selectLoc") as |loc|}}
      {{first-caps loc}}
    {{/power-select}}
  {{/bs-form-group}} 

更新 嗨@Bek感谢解决方案,有人建议我在ember slack社区。此解决方案的问题是dropLocation: uniq('dropData.locations')没有得到更新,因为uniq无法正确使用promise数组。我提出了丑陋的解决方案,但它有效。

dropLocation: Ember.computed('dropData.locations',function(){

return this.get('dropData.locations')
.then(data => data.uniq()); 
})

寻找好的解决方案

1 个答案:

答案 0 :(得分:0)

您无法观察承诺本身的变化,您可以使用PromiseObject(或PromiseArray)来包装您的承诺,以便它可以被观察到。

var promise = Ember.RSVP.resolve({ name: 'mario' });
var object = Ds.PromiseObject({ promise });

现在,您可以在模板中使用它:

{{object.name}} // mario

确保你的promise返回的对象不是原始的(或PromiseArray的数组)。

在你的情况下它应该是这样的:

locations: computed(function(){
    var promise = get(this,'store')
        .findAll('store')
        .then(stores =>{
            let locs = stores.map(store => {
                 return get(store,'adminAreaLevel2') +" "+ get(store,'adminAreaLevel1')
            });
            return locs;
        });
    return DS.PromiseArray.create({ promise });
});