Ember.js 观察员应尽早采取行动。在初始化操作之前,启动该操作

Ember.js 观察员应尽早采取行动。在初始化操作之前,启动该操作,ember.js,Ember.js,模板 <script type="text/x-handlebars"> <h2>Welcome to Ember.js</h2> {{outlet}} </script> <script type="text/x-handlebars" data-template-name="index"> <ul> {{input type="text" value=model.name}} </ul&

模板

<script type="text/x-handlebars">
  <h2>Welcome to Ember.js</h2>
    {{outlet}}
</script>

<script type="text/x-handlebars" data-template-name="index">
  <ul>
   {{input type="text" value=model.name}}
  </ul>
  <p {{action 'test'}}>test</p>
</script>
操作“test”已在route中定义,但其下面显示错误。此错误仅在我使用observes时出现


加载路由时出错:错误:没有处理“测试”操作。

您需要在控制器中处理该操作,而不是在路由中。查看此jsbin:

您应该在控制器中定义您的操作

this.send('test')
在此扩展类(在本例中为控制器)中查找操作。如果你做了这个.sendAction('test'),它会出去寻找动作,但这些动作必须像'actionName=“actionName”这样预定义。当您有一个需要与控制器交互的组件时,通常会使用此选项

{{my-component actionName="actionName"}} < sendAction now looks for controllers action
{{my component actionName=“actionName”}}
观察者在路线准备好处理动作之前开火。这种排序是有意义的,因为控制器是作为路由的一部分“构建”的。我通过在routes
setupController
hook中设置一个属性来解决这个问题,让控制器知道它已经准备好采取行动了

// Route
setupController: function(controller, model) {
    this._super(controller, model);
    controller.set('routeIsReadyForAction', true);
}

// Controller
routeIsReadyForAction: false,

someObserver: function() {
    if (!this.get('routeIsReadyForAction')) {
        return;
    }

    this.send('someRouteAction');
}.observes('someProperty'),

事实上,问题在于观察者在第一次加载数据时进行观察。它应该在数据更改时进行观察。观察模型。hasDirtyAttributes。您的错误说明“测试”操作没有处理任何内容。。所以这与观测者无关,在给定的控制器中没有这样的动作。嗯。我这里没有使用余烬数据。我只是点击了这个。似乎观察者在控制器不准备向路由发送操作的点上开火。嘿@dilip。如果你喜欢我的答案,你介意接受它作为正确的答案吗?
// Route
setupController: function(controller, model) {
    this._super(controller, model);
    controller.set('routeIsReadyForAction', true);
}

// Controller
routeIsReadyForAction: false,

someObserver: function() {
    if (!this.get('routeIsReadyForAction')) {
        return;
    }

    this.send('someRouteAction');
}.observes('someProperty'),