Ember#<object>没有方法'set'</object>

时间:2014-04-22 15:28:05

标签: json object ember.js

我正在路由中提取JSON数据,如下所示:

App.CollectionRoute = Ember.Route.extend({
 setupController: function(controller, model){
    $.getJSON('../returnitems.json', function(data){
      controller.set('returnItems', data);
    })
 }
});

这给了我一个对象,我可以在我的模板中迭代:

{{#each destination in controller.returnItems}}

现在我想通过控制器删除一些代码:

this.get('controllers.collection').get('returnItems')[returnIndex].set('hasItems', false);

出现以下错误:

Uncaught TypeError: Object #<Object> has no method 'set' 

但是当我使用时:     this.get('controllers.collection')。get('returnItems')[returnIndex] .hasItems = false

它告诉我使用get和set?!

2 个答案:

答案 0 :(得分:1)

您不应该在setupController挂钩中进行AJAX调用。您应该使用modelafterModel挂钩,以便Ember在完全转换到路径之前等待承诺成功。

现在,您无法调用set方法,因为$.getJSON会返回一个普通的旧Javascript对象数组,而不是您期望的Ember.Object数组。

相反,你会做这样的事情:

App.CollectionRoute = Ember.Route.extend({
 afterModel: function(controller, model) {
    var self = this;
    return $.getJSON('../returnitems.json', function(data_items){
        var items = [];
        for (var i = 0; i < data_items.length; i++) {
            items.push(Ember.Object.create(data_items[i]));
        }
        self.set('returnItems', items);
    });
 },
 setupController: function (controller, model) {
    controller.set('returnItems', this.get('returnItems'));
 }
});

然后你就可以:

this.get('controllers.collection').get('returnItems').objectAt(returnIndex).set('hasItems', false);

我希望这可以帮到你!

答案 1 :(得分:0)

尝试使用

this.get('controllers.collection').get('returnItems').objectAt(returnIndex).set('hasItems', false); 

请参阅:http://emberjs.com/api/classes/Ember.Array.html#method_objectAt