EmberJS:从Controller到Route的链接方法

时间:2013-04-26 10:23:12

标签: ember.js

首先,我是EmberJS世界的新手,试图探索和理解这个框架是什么,我正在使用EmberJS版本1.0.0-rc2

问题描述


我在一个简单的'身份验证'工作流程中遇到以下情况:我希望在调用transitionTo时将值从一个状态传递到另一个状态,而值应从一个视图中获取并传递到另一个视图中。在这里澄清我的情况工作流程的简短描述(@Login和@Reset代表相应的路由/控制器/模型/视图组件):

工作流:

  • @Login:用户尝试使用其凭据(帐户,用户名,密码)登录
  • @Login:用户因忘记密码而无法登录
  • @Login:用户决定重置密码并点击链接进入“重置密码”屏幕,并显示相应的
  • @Reset:用户已经在前一个屏幕上填写了'用户名'和'密码'的值,因此这里提供了
  • 用户只需点击按钮即可获得密码重置链接的邮件。

所以,正如我所理解的那样,我应该处理Route内所有正在改变状态(从'login'导航到'reset')的事情,例如登录或重置动作应该是在Controller内处理。

现在,我想将'account'和'password'的值从@Login Route传递给@Reset Route。我无法从ViewRoute访问Controller,但我可以从Controller访问Route,所以我考虑过处理reset action中的Controller以获取两个字段的值,然后在Route上调用一个方法,然后执行transitionTo方法。这是实现这种行为的正确方法吗?

我将给出一些代码示例,也许这将有助于更清楚地看到事情:

代码


的LoginController:

App.LoginController = Ember.ObjectController.extend({
account: null,
username: null,
password: null,
submitLogin: function () {
  $.ajax({
    type: 'POST',
    url: 'authentication/login',
    data: { 
      account: this.get(account), 
  username: this.get(username), 
  password: this.get(password)
    },
    success: function (data, status) {
      var dStat = data.status.toString().toLowerCase();

      if (dStat == 'ok') {
        window.location.assign(data.data.redirect);
      } else if (dStat == 'warning') {
        console.warn(dStat + data.message);
      } else if (dStat == 'error') {
        console.error(dStat + data.message);
      }
    },
    error: function (xhr, ajaxOptions, thrownError) {
      console.error('Got an ERROR on Ajax Request!');
      console.error('Status (' + xhr.status + ') - Error: ' + thrownError);
    }
  });
},

requestReset: function() {
  this.get('target').send('reset', { account: this.get('account'), username:  this.get(username)}); // <-- this is NOT working
}
});

LoginRoute:

LoginRoute = Ember.Route.extend({
  renderTemplate: function () {
  this.render('authentication-login',
    {
      outlet: 'main'
    });
  },

  events: {
    reset: function (args) {
      this.transitionTo('authentication.reset', args); // <-- does it work?
    }
  }
});

问题


我是通过链接像view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView这样的行为走在正确的道路上吗?这样做的“Ember Way”是什么?

更新1:


如果我尝试声明我的两个Controller之间的依赖关系,如@MikeGrassotti建议

App.LoginRoute = Ember.Route.extend({
  renderTemplate: function() {
    this.render('login', { outlet: 'main' });
  },

  events: {
    reset: function() {
      this.transitionTo('reset');
    }
  }
});

App.LoginController = Ember.ObjectController.extend({
  account: null,
  username: null,
  password: null,

  login: function() {

  }
});


App.ResetRoute = Ember.Route.extend({
  renderTemplate: function() {
    this.render('reset', { outlet: 'main' });
  }
});

App.ResetController = Ember.ObjectController.extend({
  needs: ['login'],
  accountBinding: 'controllers.login.account',
  usernameBinding: 'controllers.login.username'
});

我收到以下错误消息:

Uncaught Error: assertion failed: Cannot delegate set('account', (null)) to the 'content' property of object proxy <App.ResetController:ember198>: its 'content' is undefined

如果我只是声明needs的{​​{1}}属性并从相应的模板中调用ResetController,我就不会收到任何错误,但我也没有得到任何价值(因为我输入'asdf'作为登录表单的帐户字段中的值)...

1 个答案:

答案 0 :(得分:3)

  

我是通过链接像view这样的动作走向正确的道路 - &gt;控制器 - &gt; route(transitionTo) - &gt; otherRouter - &gt; otherController - &gt; otherView?

在转换方面是肯定的,但在尝试传递参数方面没有。您应该在transitionTo中传递参数的唯一时间是需要上下文时transitionTo('post', somePost)

  

我想将'account'和'password'的值从@Login Route传递给@Reset Route。这样做的“Ember Way”是什么?

不是将值从一个路由传递到另一个路由,而是使用绑定来访问控制器的属性。例如:

App.ResetController = Ember.ObjectController.extend({
  needs: ['login'],
  accountBinding: 'controllers.login.account',
  usernameBinding: 'controllers.login.username'
});

现在只需使用transitionTo('reset')而不使用args切换到重置路径。