【问题标题】:EmberJS: Chaining methods from Controller to RouteEmberJS:从控制器到路由的链接方法
【发布时间】:2013-04-26 10:23:12
【问题描述】:

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

问题描述


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

工作流程:

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

所以,据我所知,我应该在Route 中处理所有正在改变状态的事情(从“登录”导航到“重置”),诸如登录或重置操作之类的事情应该在Controller

现在,我想将“帐户”和“密码”的值从 @Login 路由传递到 @Reset 路由。我无法从RouteController 访问View,但我能够从Route 访问Controller,所以我考虑处理reset action Controller 获取两个字段的值并调用 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 --&gt; controller --&gt; route (transitionTo) --&gt; otherRouter --&gt; otherController --&gt; otherView 之类的操作,我是否走在正确的道路上?这样做的“Ember Way”是什么?

更新 1:


如果我尝试像@MikeGrassotti 建议的那样声明我的两个Controllers 之间的依赖关系

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

如果我只是为ResetController 声明needs 属性并从相应的模板调用controllers.login.account,我没有收到任何错误,但我也没有得到任何值(假设我在帐户字段中输入了“asdf”作为值登录表单)...

【问题讨论】:

    标签: ember.js


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 非常感谢您@MikeGrassotti 的回答,但是当我这样尝试时看到以下错误:Uncaught Error: assertion failed: Cannot delegate set('account', (null)) to the 'content' property of object proxy &lt;App.ResetController:ember198&gt;: its 'content' is undefined.
    • 这是我的ResetController 的代码 sn-p(我希望它在 commnet 中以某种方式可读):App.ResetController = Ember.ObjectController.extend({ needs: ['login'], accountBinding: 'controllers.login.account', usernameBinding: 'controllers.login.username', requestResetMail: function () { alert('Requesting Mail for User ' + this.get('usernameBinding') + ' @ ' + this.get('accountBinding')); }, cancel: function() { this.set('accountBinding', null); this.set('usernameBinding', null); } });
    • 我发布了对我最初问题的更新,以便为代码示例提供更好的格式并对我的问题进行更好的解释;)
    • 好的,我做了一些进一步的研究,看起来绑定工作(如预期)就像在你的例子中一样,但是代表我的 input 字段的变量的值@ 987654328@ 仅在控制器的login 操作上更改,否则它们保持不变(如果我在TextField 中键入内容)并因此返回它们的初始化值...
    • 我在检查应用程序启动时发生的情况时发现了错误,我看到,当我从 LoginRoute 中使用 renderTemplate 时,我实际上得到了 LoginController 对象的 2 个实例,而没有首先显式声明模板控制器。非常感谢您的回答 - 我会接受并关闭这个问题,因为 Binding 现在就像一个魅力;)
    猜你喜欢
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多