2013-07-10 55 views
1

在设置应用路由器,我请求一些数据到后端:触发功能,一旦一个REST请求已完成

App.Node = DS.Model.extend({ 
    ... 
}); 

App.ApplicationRoute = Ember.Route.extend({ 
    processReply: function () { do some processing here; }, 
    setupController: function (controller, model) { 
     this.cache = App.Node.find(); 
    } 
}); 

现在,当从后台收到的find的结果,我想通过调用this.processReply()

我怎样才能听到find请求的完成?我试图插入.then方法(假设find返回承诺),但是这阻止了我的应用程序。

setupController: function (controller, model) { 
     var _this = this; 
     this.cache = App.Node.find().then(function(data) { 
      _this.process(); 
     }); 
    } 
+0

你在哪里,删除了我的答案,因为它不适用于你的用例 – intuitivepixel

回答

1

setupController是同步的,不像model挂钩。您可以延迟从承诺中设置控制器的内容。因此,数据加载后,控制器的绑定/计算属性会触发。

setupController: function(controller, model) { 
    App.Node.find().then(function(data) { 
    controller.set('content', data); 
    // optionally 
    // controller.process() 
    }); 
} 
+0

谢谢Darshan,但我不明白。 “find”的作用不是设置控制器的内容吗?对应于'App.Node'的控制器不一定是我在'setupController'中的控制器。在我原来的实现中,我不**设置控制器的内容。为什么我应该在听'then'的时候被迫去做呢?我希望能够钩住promise的'.then',而不会对ember在内部处理promise的方式造成任何副作用,最终必须从处理'then'时返回一个值(promise?) '。 – dangonfast

+0

'Route.model()'是使用'find'加载数据的钩子。当'find'返回一个promise时,路由器会这样做。在调用setupController时,假定你已经加载了模型,因此第二个参数是'model'。这正是默认的setupController所做的,'controller.set('content',model)'。但是如果在setupController中加载额外的数据,就路由器而言已经太晚了,它的转换生命周期已经完成。因此你必须手动完成这项工作。 –

相关问题