【问题标题】:ember.js: extend Ember.TextField and only update value property on enter keyember.js:扩展 Ember.TextField 并且仅在输入键上更新 value 属性
【发布时间】:2026-01-19 05:40:01
【问题描述】:

我希望创建一个文本字段,就像使用输入助手的文本字段一样,只是它的行为略有不同:它不会更新绑定到的属性,直到按下回车键。我扩展了组件并尝试覆盖可能更新属性的函数:

InputTextSoftComponent = Ember.TextField.extend(
  keyPress:->
    console.log("keypress")
  propertyDidChange:->
    console.log('propChange')
  didInsertElement:->
    console.log('insert')
  modelChangedValue:->
    console.log('changeval')

)

该组件现在就像一个普通的文本字段一样工作,我很惊喜

{{input-text-soft id="height-input" class="position-inputs" type="text" value=controller.activeRegion.width}}

但是,我无法阻止文本字段中的更改更新值目标。我怎样才能防止这种情况并实现一种软绑定,以便输入只更新输入键上的属性?我正在寻找特定于 Ember CLI 和组件使用的解决方案。

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    创建不同的绑定属性。您的不动产的别名。将您的文本字段绑定到该属性。仅当按下 enter 时才从别名更新真实属性。伪:

    {{input-text-soft id="height-input" realValueBinding="controller.activeRegion.width" value=newWidth...}}
    
    keyPress() {
      if (keyCode == xx)
         this.set('realValue', this.get('newWidth'))
    }
    

    【讨论】:

    • 我试图避免这种情况,因此我不必为组件外部的每个输入创建“脏”变量。假设我必须复制值 activeRegion.width 并将其放入另一个变量 newWidth 中,对吗?
    • 哦,也许我可以让组件将“值”绑定到一个中间变量,该变量已初始化为 realValue 的值,所以我不必传入值
    • 当然你可以用任何你想要的初始化newValue。但是将文本字段值绑定到一个属性,会使该属性发生变化。因此,如果您不想更改原始属性,除了创建不同的属性之外别无他法。