0

您好 emberjs 专家 :)

有一点我不明白。

给定以下路线:

Evibe.MemberShowRoute = Ember.Route.extend({
    model: function(params) {
        return Ember.$.getJSON('/api/user').then(function(user) {
            return Ember.Object.create(user);
        });
    }
});

对 api 的调用只返回一个包含属性的用户对象。此属性之一是图片对象数组。像那样:

{
    username: "A nice user",
    pictures: [
        {id: 1, is_main: true,  url: 'http://www.test.com/img1.jpg'},
        {id: 2, is_main: false, url: 'http://www.test.com/img2.jpg'},
        {id: 3, is_main: false, url: 'http://www.test.com/img3.jpg'},
        {id: 4, is_main: false, url: 'http://www.test.com/img4.jpg'},
    ]
}

在我的控制器中,我有这样的东西:

Evibe.MemberShowController = Ember.ObjectController.extend({
    nb_pictures: function() {
        return this.pictures.length;
    }.property('pictures'),

    addPictureObject: function(picture) {
        this.get('pictures').addObject(picture);
    }
});

在我的模板中,我有这样的东西:

{{ nb_pictures }} pictures

我不明白为什么 nb_pictures 没有更新,因为我正在使用 addPictureObject 函数将对象添加到我的“图片”属性中。

另外,当我尝试做这样的事情时:

this.get('pictures').setEach('is_main', false);                   // Works
this.get('pictures').findBy('id', pictureId).is_main = true;      // Doesn't work
this.get('pictures').findBy('id', pictureId).set('is_main', true) // Doesn't work

第一行按预期工作。

但是...对于第二行,我收到错误消息:“断言失败:您必须使用 Ember.set() 来访问此属性([object Object])”

对于第三个,我收到错误消息:“未捕获的 TypeError:Object # has no method 'set'”

任何可以帮助澄清这一点的想法将不胜感激。

4

1 回答 1

1

在您的nb_pictures计算属性中,您已将依赖键设置为property('pictures'),正确的是property('pictures.length')

这是更新的代码:

Evibe.MemberShowController = Ember.ObjectController.extend({
    nb_pictures: function() {
        return this.get('pictures.length');
    }.property('pictures.length'),

    addPictureObject: function(picture) {
        this.get('pictures').addObject(picture);
    }
});

使用 justproperty('pictures')将使框架只观察数组替换,set('pictures', [...])而不是数组结构的变化get('pictures').pushObject(...)。这就是您的 ui 不更新的原因。

于 2013-10-22T16:13:29.020 回答