簡體   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