1

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

问题描述


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

工作流程:

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

所以,据我了解,我应该处理所有RouteController.

现在,我想将“帐户”和“密码”的值从 @Login 路由传递到 @Reset 路由。我无法访问ViewfromRoute或 from Controller,但我能够访问Controllerfrom the Route,所以我考虑处理reset actioninController以获取两个字段的值并调用Route然后将执行的方法transitionTo方法。这是实现这种行为的正确方法吗?

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

代码


登录控制器:

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 = 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 建议的那样声明我的两个 s之间的依赖关系

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属性,我没有收到任何错误,但我也没有得到任何值(假设我在登录表单的帐户字段中输入了“asdf”作为值)......ResetControllercontrollers.login.account

4

1 回答 1

3

通过链接诸如 view --> controller --> route (transitionTo) --> otherRouter --> otherController --> otherView 之类的操作,我是否走在正确的道路上?

在转换方面是的,但在尝试传递参数方面不行。您应该在 a 中传递 args 的唯一时间transitionTo是需要上下文时,如transitionTo('post', somePost)

我想将“帐户”和“密码”的值从 @Login 路由传递到 @Reset 路由。这样做的“Ember Way”是什么?

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

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

现在只需使用不带参数的 transitionTo('reset') 即可切换到重置路线。

于 2013-04-26T12:02:13.193 回答