我有一个模型,我们称之为任务,它有一个属性受让人。我有另一个模型管理员,那是一组管理员。在任务中,我想添加一个属性 admin,它通过电子邮件从管理员中查找受让人并返回该管理员。
Admin 上的主键不是电子邮件,在 Ember 模型中,看起来不可能在主键以外的任何键上创建 belongsTo
关联。我通过电子邮件而不是 ID 发送的原因是管理员并不总是存在。
任务模型看起来像这样:
import Em from 'ember';
import Admin from 'project/models/admin';
import PromiseObject from 'project/lib/promise-object';
var Task = Em.Model.extend({
id: Em.attr(),
name: Em.attr(),
assignee: Em.attr(),
admin: function() {
return PromiseObject.create({
promise: Admin.fetch({ email: this.get('assignee') })
}).then(function(json) {
return Admin.create(json);
}, function() {
return null;
});
}.property('assignee'),
adminName: Em.computed.oneWay('admin.name')
});
export default Task;
PromiseObject 只是扩展 PromiseProxyMixin,看起来像这样:
import Em from 'ember';
export default Em.ObjectProxy.extend(Em.PromiseProxyMixin);
当我尝试访问该属性时,我可以看到管理员的网络请求通过网络传输,并且我可以看到包含正确详细信息的成功响应。但是, promise 会返回 null
。
我希望在我的模板中包含 {{task.adminName}}
。在这一点上,我对在我的模型中正确解决管理 promise 的最佳方式感到困惑。
最佳答案
您返回的不是 PromiseObject
,而是一个链式 promise 。您应该只返回 PromiseObject
。
admin: function() {
var promise = $.getJSON("/admin").then(function(json) {
return Admin.create(json);
}, function() {
return null;
});
return PromiseObject.create({
promise: promise
});
}.property('assignee'),
示例:http://emberjs.jsbin.com/nobima/12/edit
将 Ember 模型 fetch
与对象一起使用会返回一个集合,而不是模型(当然除非您要获取的不是 Ember 模型)。所以 json 不是此时返回的内容。您可能想按照这些思路做些事情。
admin: function() {
var promise = Admin.fetch({ email: this.get('assignee') }).then(function(collection){
return collection.get('firstObject');
}, function() {
return null;
});
return PromiseObject.create({
promise: promise
});
}.property('assignee'),
关于javascript - 在 Ember 模型的计算属性中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26792117/