【问题标题】:Ember.js checkbox and PromiseEmber.js 复选框和承诺
【发布时间】:2015-10-23 05:29:17
【问题描述】:

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

我有一个包含 userId、modelId、privilegeId 和 scopeId 的 userPrivilege 表。

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

我可以使用异步函数来确定用户是否具有权限,但我只是不知道如何将其分配给“已选择”复选框。返回承诺意味着复选框始终处于选中状态。从 Promise 中返回值总是不选中。

请看下面我正在尝试的东西的 sn-p...

复选框组件:

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

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

这现在可以工作了,只是如果权限不存在,它不会解析为 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) {
          });
        });
      });
    });

【问题讨论】:

  • 你知道你可以链而不是嵌套承诺吗?
  • @Gaurav,谢谢你。我对这一切都很陌生,所以我不知道链接。感谢您的提示。

标签: javascript ember.js checkbox


【解决方案1】:

当你现在有错误时,你只需要拒绝,如果其中一个错误发生,你需要将你的外部承诺解决为 false。

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。

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

【讨论】:

  • 我尝试了这段代码,但一直只从承诺中得到错误的解决。从 enumerable.find 的文档中,我需要为找到的项目返回 true 或 false 不包含。所以我将解析交换为返回真或假。但 find 只返回未定义...这是我更新的代码:jsbin.com/jexudu/edit?js
  • 修改代码和解释见原帖。
猜你喜欢
  • 1970-01-01
  • 2016-03-09
  • 2015-05-12
  • 2017-12-23
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多