Ember.Object计算属性返回一个对象

时间:2013-01-31 09:47:56

标签: ember.js

所以我有一个Ember对象:

App.User = Ember.Object.extend({
    firstName: null, 
    lastName: null, 
    dob: Ember.Object.create({
        day: null,
        month: null,
        year: null,
        display: function () {
            var self = this,
            day = (self.get('day') < 10 ? "0" : "") + self.get('day'),
            month = (self.get('month') < 10 ? "0" : "") + self.get('month'),
            year = self.get('year');

            return day + '/' + month + '/' + year;
        }.property('day', 'month', 'year')
    })
});

在我的控制器上 - 我正在创建一个对象的版本 - 然后由一个表单绑定:

App.IndexController = Em.ArrayController.extend({
    user: App.User.create()
});

但是 - 出于某种原因,每当我尝试在我的控制器或视图中获取dob.display计算机属性时,我只会返回一个对象。

this.get('user.dob.display')

{{user.dob.display}}

任何想法如何确保它返回一个字符串?直到几天前我从1.0.0-pre2更新到1.0.0-pre4时才开始工作。

2 个答案:

答案 0 :(得分:4)

您不应使用create,而应使用createWithMixins。这是在对象创建时定义计算属性的唯一方法:

dob: Ember.Object.createWithMixins({
    day: null,
    month: null,
    year: null,
    display: function () {
        day = (this.get('day') < 10 ? "0" : "") + this.get('day'),
        month = (this.get('month') < 10 ? "0" : "") + this.get('month'),
        year = this.get('year');

        return day + '/' + month + '/' + year;
    }.property('day', 'month', 'year')
})

一句话:在extend方法中设置属性时,每个实例共享同一个对象。 如果您不知道,go read "Understanding Ember.Object" article written by Dan Gebhardt(这篇文章可能有点过时,但想法仍然相同)。

因此,在这里,你有:

var user1 = App.User.create().get("dob").set("year", 1988);
var user2 = App.User.create();
console.log(user2.get("dob.year")); // => 1988

如果要定义实例之间不同的对象,则必须覆盖init方法,如下所示:

App.User = Ember.Object.extend({
    init: function() {
        this._super(); // do not forget that
        this.set('dob', Ember.Object.createWithMixins({
            // [code ommitted]
        }));
    }
});

但我建议您创建一个模型dob,而不是每次创建用户时都创建它。

您可以尝试this in a JSFiddle

答案 1 :(得分:0)

在pre4中,您无法在创建的Ember.Object上定义计算属性。

不允许

dob: Ember.Object.create({
    day: null,
    month: null,
    year: null,
    display: function () {
        var self = this,
        day = (self.get('day') < 10 ? "0" : "") + self.get('day'),
        month = (self.get('month') < 10 ? "0" : "") + self.get('month'),
        year = self.get('year');

        return day + '/' + month + '/' + year;
    }.property('day', 'month', 'year')
})

只允许在扩展的对象上执行此操作。

我创建了一个与你的dob逻辑一起工作的小提琴(修改后的修改)。

http://jsfiddle.net/Energiz0r/AeDAw/4/