2014-11-07 64 views
1

我有一个模型,我们称之为Task,它有一个财产受让人。我有另一个模型管理员,这是一组管理员。在任务上,我想添加一个属性admin,它通过电子邮件从管理员处查找受理人并返回该管理员。在Ember模型的计算属性中使用承诺

Admin上的主键不是电子邮件,而在Ember Model中,看起来不可能在主键以外的任何键上创建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); 

当我尝试访问属性,我可以看到网络管理员通过网络发送请求,我可以看到包含正确详细信息的成功响应。但是,null是为承诺返回。

我期待在我的模板中包含{{task.adminName}}。在我的模型中,正确解决管理承诺的最佳方式是在这一点上我有点难住。

+1

您无法在承诺上定义计算属性。相反,请在异步回调处理程序(或'then'子句)中设置属性。 – 2014-11-07 03:42:58

回答

2

你没有返回PromiseObject,你正在返回一个链接的承诺。您应该只返回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

使用灰烬型号fetch与对象返回一个集合,而不是一个模型(当然,除非你是取不烬模型)。所以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'),