【问题标题】:Ember computed property on a controller not bound in template控制器上的 Ember 计算属性未绑定在模板中
【发布时间】:2014-07-05 05:34:07
【问题描述】:

我正在尝试实现一个密码强度检查器,它会在每次按键时更新。我的模板如下所示:

{{input type="password" id="password" value=password }}

我的控制器如下所示:

App.SignupController = Ember.Controller.extend
  passwordStrength: ((key,val) ->
    # check strength if val is defined
    return
  ).property('password')

在字段中输入文本时永远不会调用passwordStrength

然而,如果我将方法重命名为 password 并删除计算属性的名称,它确实有效:

App.SignupController = Ember.Controller.extend
  password: ((key,val) ->
    # check strength if val is defined
    return
  ).property()

我宁愿理解为什么前者不起作用,并使用更明智的命名方法。

【问题讨论】:

  • 你想用 passwordStrength 属性做什么?,你打算用它来显示警告信息吗?为什么不将 passwordStrength 更改为观察者?,一旦观察到的属性之一发生变化,观察者就会触发,可能将观察者命名为不同的名称,例如 checkPasswordStrength,然后设置 isPassWordStrong 属性,并在模板中使用该属性.
  • fanta 我基本上只是将您的评论放入答案并创建了一个 jsbin

标签: ember.js coffeescript


【解决方案1】:

我创建了一个 jsbin 供您查看,当密码更新时它正在工作和更新。我想我知道为什么这对你不起作用。在我的 js bin 中 http://emberjs.jsbin.com/gekofo/4/edit?html,js,console,output 你会注意到只有观察者 console.logs。而在您的程序中,我想您可能没有显示 passwordStrength 值。如果您将 {{passwordStrength}} 添加到我的 bin 中的模板中,您将看到属性已更新。所以看起来你可能想使用我写的passwordStrength2,因为它会更新它是否显示在DOM中。

简而言之就是这样:

passwordStrength2: function() {
   //check strength if val is defined
   console.log("OBSERVER::", this.get('password.length'))
   return this.get('password.length');
}.observes('password')

不是:

passwordStrength: function() {
  //check strength if val is defined
  console.log("PROPERTY::", this.get('password.length'))
  return this.get('password.length');
}.property('password')

我也不知道coffeescript,很抱歉我的答案是javascript。

【讨论】:

  • 这让我走上了正确的道路。在我的模板中,我设置了value=password 并在我的控制器中使用observes('password') 来做我想做的事。感谢您的帮助!
  • 没问题,很高兴我能帮上忙。
猜你喜欢
  • 2014-08-19
  • 2014-05-26
  • 2017-05-21
  • 1970-01-01
  • 2013-06-26
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多