所以我有一个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时才开始工作。
答案 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逻辑一起工作的小提琴(修改后的修改)。