繁体   English   中英

Ember.js复选框和Promise

[英]Ember.js checkbox and Promise

尝试使用复选框来计算是否存在一对多关系时,我遇到问题。

我有一个userPrivilege表,其中包含userId,modelId,privilegeId和scopeId。

我正在尝试显示复选框,以显示用户是否具有特权。 为此,我需要检查多个条件,而不仅仅是一个简单的布尔字段。

我可以使用异步函数来确定用户是否具有特权,但是我只是不知道如何将其分配给“选定”复选框。 返回承诺意味着始终选中该复选框。 从promise中返回值总是使其不受检查。

下面是我正在尝试的内容的摘要...

复选框组件:

    export default Ember.Component.extend({
          user: null,
          model: null,
          privilege: null,
          scope: null,
          selected: function() {
            return this.get('authorization').hasAuthorization(
              this.get('user.id'), 
              this.get('model'), 
              this.get('privilege'), 
              this.get('scope')).then(function(result) {
              return result;
            });
          }.property()
        })

服务:

export default Ember.Service.extend({
  hasAuthorization: function(userId, model, privilege, scope) {
    var store = this.get('store');

    return new Ember.RSVP.Promise(function (resolve, reject) {
      store.find('user', userId).then(function (user) {
        user.get('userPrivileges').then(function (userPrivileges) {
          userPrivileges.find(function (userPrivilege, index, userPrivileges) {
            userPrivilege.get('model').then(function (_model) {
              if (_model.get('name') === model) {
                userPrivilege.get('privilege').then(function (_privilege) {
                  if (_privilege.get('name') === privilege) {
                    userPrivilege.get('scope').then(function (_scope) {
                      if (_scope.get('name') === scope) {
                        resolve(true);
                      }
                    });
                  }
                });
              }
            });
          });
        });
      });
    });
  }
});

编辑:根据评论,我现在尝试链接,但是当不满足if语句时(因为没有返回承诺),现在_privilege和_scope是未定义的。 我认为使用其他结构可以做得更好,我只需要弄清楚如何做。

现在可以正常工作,但是如果权限不存在则不会解析为false:

return new Ember.RSVP.Promise(function (resolve, reject) {
      store.find('user', userId).then(function (user) {
        if (!user) {
          return resolve(false);
        }
        return user.get('userPrivileges');
      }).then(function(userPrivileges) {
        if (!userPrivileges) {
          return resolve(false);
        }
        userPrivileges.forEach(function (userPrivilege) {
          userPrivilege.get('model').then(function (_model) {
            if (_model.get('name') === model) {
              return userPrivilege.get('privilege');
            }
          }).then(function (_privilege) {
            if (_privilege.get('name') === privilege) {
              return userPrivilege.get('scope');
            }
          }).then(function (_scope) {
            if (_scope.get('name') === scope) {
              console.log('true: ' + model + ' ' + privilege + ' ' + scope);
              return resolve(true);
            }
          }).catch(function(error) {
          });
        });
      });
    });

您现在只需要在出现错误时就拒绝,并在出现这些错误之一的情况下将您的外在承诺变为假。

import Ember from 'ember';

export default Ember.Service.extend({
  hasAuthorization: function (userId, model, privilege, scope) {
    var store = this.get('store');

    return new Ember.RSVP.Promise(function (resolve, reject) {
      store.find('user', userId).then(function (user) {
        if (!user) {
          return resolve(false);
        }
        return user.get('userPrivileges');
      }).then(function(userPrivileges) {
        if (!userPrivileges) {
          return resolve(false);
        }
        return resolve(userPrivileges.find(function (userPrivilege, index, userPrivileges) {
          userPrivilege.get('model').then(function (_model) {
            if (_model.get('name') === model) {
              return userPrivilege.get('privilege');
            }
            return Ember.RSVP.reject();
          }).then(function (_privilege) {
            if (_privilege.get('name') === privilege) {
              return userPrivilege.get('scope');
            }
            return Ember.RSVP.reject();
          }).then(function (_scope) {
            if (_scope.get('name') === scope) {
              return Ember.RSVP.resolve(true);
            }
            return Ember.RSVP.reject();
          }).then(null, function(error) {
            return Ember.RSVP.resolve(false);
          });
        }));
      });
    });
  }
});

then采用第二个参数来处理错误。 https://github.com/tildeio/rsvp.js/#basic-usage

链接时,如果拒绝链的任何先前方法,则调用第二个参数。

在这种情况下,如果发生拒绝,我们希望将原始的承诺解析为false。

更新:解决了查找可能返回未定义的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM