路径中的Ember setupController挂钩断开模型与模板的连接

h7appiyu  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(149)

我试图在输入登录路径后设置控制器属性。目前,我使用的是方法1,它依赖于控制器中的init。它工作正常,但我认为最好在路径中使用setupController钩子。Ember数据显示已创建的记录,并且当您键入时,电子邮件和密码字段会更新。
我试过改变代码,在路由中使用setupController钩子**(方法2)**,而不是依赖于控制器中的init。使用这种方法,当进入路由时会创建新记录,但电子邮件和密码在Ember数据中是未定义的,并且在键入时不会更新。
有没有方法可以在不断开模型连接的情况下仍然使用setupController?

方法1 -工作

routes/login.js

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

controllers/login.js

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

模板/登录.hbs

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

方法2 -无效

routes/login.js

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

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

模板/登录.hbs

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

dm7nw8vv1#

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

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

因此,您可以在setupController中也使用这一行,或者调用super.setupController(...arguments);(后者将运行您的基类中的代码),这更好:

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

一般来说,当您覆写函式时,您应该 * 永远 * 考虑呼叫super.<method name>()

相关问题