2014-11-07 75 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'),