[英]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.