如何从路由中传递模板中的错误?

时间:2015-11-10 04:54:32

标签: ember.js

我做'服务器端验证'。在路由方法'catch'从服务器获取错误。我想在模板中传递这个错误。 如何从路径中传递模板中的错误?

import Ember from 'ember';
import DS from 'ember-data';

export default Ember.Route.extend({
  model() {
    return this.store.createRecord('project');
  },

  actions: {
    save(project) {
      var router = this;
      var errors = router.controllerFor('project.new').get('errors')
      project.save().then(function(project){
        router.transitionTo('projects.show', project);
      }).catch(function(resp) {
        // how to pass this errors in template ???? 
        console.log(resp.errors);
      });
    }
  }, 
});

来自router.js

this.route('projects', function() {
    this.route('new');
    this.route('show', { path: '/:project_id' });
 });

来自组件

import Ember from 'ember';
import DS from 'ember-data'

export default Ember.Component.extend({
  actions: {
    save() {
      this.project.set('colors', colors);
      this.sendAction('save');
    }
  },
  ...
});

1 个答案:

答案 0 :(得分:0)

Closure Actions! (假设有一个版本--Ember 1.13+)。与常规操作不同,关闭操作可以具有返回值。

在您的模板上执行:

{{my-component mySave=(action 'save')}}

在您的组件中,您可以

import Ember from 'ember';
import DS from 'ember-data'

export default Ember.Component.extend({
  actions: {
   save() {
     this.project.set('colors', colors);
     let result = this.attrs.mySave();
     //do something with result
   }
 },
 ...
 });

然后在你的控制器中:

import Ember from 'ember';
import DS from 'ember-data';

export default Ember.Controller.extend({

actions: {
  save(project) {
    var router = this;
    var errors = router.controllerFor('project.new').get('errors')
    project.save().then(function(project){
    router.transitionTo('projects.show', project);
  }).catch(function(resp) {
    return resp.errors;
  });
 }
 }, 
});

我还建议this article on Closure Actions,这非常有帮助。

编辑:我最初回复路径上的操作(如您的示例所示),但@Kitler正确地提醒关闭操作与控制器或其他组件通信。我不知道这是否是OP的一个选项?