来自承诺的计算财产

时间:2014-07-29 14:39:39

标签: ember.js ember-data

我有一个带有关系(很多)的余烬数据模型。所以有一个计算属性取决于关系元素。我需要根据关系属性的数据返回布尔值。

isAllowed: function(){
        return this.get('allowedUsers').then(function(data){
            var user = this.get('currentUser');
            return data.contains(user);
        }.bind(this));
}.property()

在上面的代码中,isAllowed是计算属性,allowedUsersuser模型有许多关系,async设置为true。 isAllowed被设置为promise对象而不是返回布尔值。我甚至试图创建另一个承诺对象,如下面但没有运气。

 isAllowed: function(){
            return new Ember.RSVP.promise(function(resolve, reject){
               this.get('allowedUsers').then(function(data){
                var user = this.get('currentUser');
                 resolve(data.contains(user));
              }.bind(this));

            }.bind(this));
    }.property()

如何确保将isAllowed设置为布尔值而不是promise对象?

3 个答案:

答案 0 :(得分:5)

试试这个:

isAllowed: function(key, value){
  if (arguments.length > 1) return value; // the setter was called

  this.get('allowedUsers').then(function(data){
    var user = this.get('currentUser');
    this.set("isAllowed", data.contains(user));
  }.bind(this));

  return false;
}.property()

答案 1 :(得分:3)

您应该使用DS.PromiseObject

isAllowed: Ember.computed('model.users.[]', 'session.currentUser', function() {
  return DS.PromiseObject.create({
    promise: this.get('session.currentUser').then((user) => {
      if (!user) {
        return false;
      }
      return this.get('model.users').isAny('id', user.get('id'));
    })
  });
})

http://emberjs.com/api/data/classes/DS.PromiseObject.html

答案 2 :(得分:1)

如果这是我,我会使用false初始化,然后将其设置为在setupController挂钩中解析。例如,在您的控制器中:

isAllowed: false, // Default with access denied

现在您可以利用您的路线了。路线已经在模型和控制器上玩杂耍,所以通常感觉就像是解决侧载承诺的正确位置:

App.FooRoute = Ember.Route.extend({
  model: function () {
    //...
  },

  setupController: function (controller, model) {
    this.setUserAccess(controller, model);
    // more methods if needed...
  },

  setUserAccess (controller, model) {
    controller.get('allowedUsers').then(function(data){
      var user = controller.get('currentUser');
      controller.set("isAllowed", data.contains(user));
    });
  }
);

我不确定allowedUsers来自哪里。你可能需要调整它。

你可以这样做,但是当我用静态属性覆盖计算属性时,我总觉得有点icky。当然,它没有任何问题。