0

所以我有一个 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。

4

2 回答 2

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方法中设置属性时,每个实例共享同一个对象。如果您不知道,请阅读 Dan Gebhardt 撰写的“Understanding Ember.Object”文章(这篇文章可能有点过时,但想法仍然相同)。

因此,在这里,您有:

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,而不是每次创建用户时都创建它。

您可以在 JSFiddle 中尝试此操作

于 2013-01-31T10:41:10.463 回答
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 逻辑的小提琴(abit modified)。

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

于 2013-01-31T10:08:23.267 回答