关于 javascript:Ember setupController hook in route 断开模型与模板

Ember setupController hook in route disconnects model from template

我正在尝试在输入登录路径后立即设置控制器属性。目前,我正在使用方法 1,它依赖于控制器中的 init。它工作正常,但我的理解是在路由中使用 setupController 挂钩会更好。 Ember 数据显示已创建的记录,并在您键入时更新电子邮件和密码字段。

我尝试更改代码,在路由中使用 setupController 挂钩(方法 2),而不是依赖控制器中的 init。使用此方法,输入路由时会创建新记录,但在 Ember 数据中未定义电子邮件和密码,并且在键入时不会更新。

有没有办法在不断开模型的情况下仍然可以使用 setupController?

方法 1 - 工作

路由/login.js

1
2
3
model: function() {
  return this.store.createRecord('authorisation');
},

控制器/login.js

1
2
3
setPreLoginMessage: function() {
  this.set('preLoginMessage', 'Please enter your username and password.'));
}.on('init'),

模板/login.hbs

1
2
{{input placeholder="Email" value=model.email}}
{{input placeholder="Password" value=model.password}}

方法 2 - 不工作

路由/login.js

1
2
3
4
5
6
7
model: function() {
    return this.store.createRecord('authorisation');
  },

  setupController: function(controller, model) {
    controller.set('preLoginMessage', 'Enter your username and password'));
},

模板/login.hbs

1
2
{{input placeholder="Email" value=model.email}}
{{input placeholder="Password" value=model.password}}

您正在覆盖默认的 setupController 功能,即:

1
2
3
setupController(controller, model) {
  controller.set('model', model);
}

所以你要么在你的 setupController 中也使用这一行,或者,更好的是,只调用 super.setupController(...arguments); 它将从你的基类运行代码:

1
2
3
4
setupController: function(controller, model) {
  super.setupController(...arguments);
  controller.set('preLoginMessage', 'Enter your username and password'));
}

一般来说,当你覆盖函数时,你应该总是考虑调用 super.<method name>()