如何在控制器中设置/修改模型

时间:2014-10-21 11:35:20

标签: ember.js

我正在为ember 1.7.0中的ajax操作做一个基本的例子,我所做的是在路由中有一个模型,并为原始数据做了一个ajax get。

App.IndexRoute=Em.Route.extend({ 
                       model:function(){
                            return Em.$.get('data.json');
                        },
                  }

现在在控制器中我想为模板修改它,我试过

App.IndexController = Ember.Controller.extend({
  init:function(){this._super();
                  var newmodel=this.get('content');
                       ....some modification...
                         this.set('model',newmodel);
                   }
                }

但这不起作用。

那么基本上如何修改模型?这应该在setupController或控制器中? 如果需要如何在控制器中获取和设置模型?另一个困惑是何时创建以及何时扩展控制器和路由?

感谢。

3 个答案:

答案 0 :(得分:2)

在你的路线中寻找setupController钩子

App.IndexRoute = Em.Route.extend({
  model: function() {
    return Em.$.get('data.json');
  },
  setupController: function(controller, model) {
    this._super(controller, model);
    //Some modifications
    //..
    //end of modificaitons
    controller.set('model', model);
  }
});

答案 1 :(得分:2)

extend()用于为任何类创建子类,例如Ember.ArrayController。如果要覆盖现有类的属性(方法),可以使用extend。

create()用于创建类的新实例。请参阅此http://emberjs.com/guides/object-model/classes-and-instances/

在您想要为控制器设置任何属性之前,无需使用setupController的{​​{1}}挂钩。

如果您的Route有模型钩子并返回数据,那么您可以使用

直接在控制器中访问模型
Route

同时您可以使用setter更新/修改模型。

var model = this.get('model');

查看简单的bin http://jsbin.com/fesux/edit

请看看Ember.set和Ember.get

答案 2 :(得分:1)

您可以使用setupController来处理此

App.IndexRoute=Em.Route.extend({ 
  model:function(){
    return Em.$.get('data.json');
  },
  setupController: function(controller, model){
    controller.set('model',model);
  }
}

setupController挂钩接收路由处理程序的关联控制器作为其第一个参数。在这种情况下,IndexRoute的setupController接收应用程序的App.IndexController实例。

默认的setupController挂钩将关联控制器的model属性设置为路由处理程序的模型。

如果要配置与路由处理程序关联的控制器以外的控制器,请使用controllerFor方法。

此处有更多详情: http://emberjs.com/guides/routing/setting-up-a-controller/