Aurelia自定义属性中的双向绑定

时间:2016-02-26 17:40:38

标签: javascript aurelia aurelia-binding

  

更新:看起来这是一个众所周知的错误: https://github.com/aurelia/templating/issues/253
  我将它留在这里作为参考/可搜索目的。

代码:

input-mask.ts (可以看到完整代码here

@customAttribute('input-mask')
@inject(Element)
export class InputMaskCustomAttribute {

    @bindable({ defaultBindingMode: bindingMode.twoWay,
                changeHandler: 'onUnmaskedValueChanged'  })
    unmaskedValue: any;

    onUnmaskedValueChanged(newValue, oldValue) {
        console.log('unmaskedValue updated from inside the custom attribute');
    }

    @bindable
    mask: string;

    attached() {

          this.eventTarget.on('focusout', (e: any) => {
             this.unmaskedValue = (<any>$(this.element)).cleanVal()
             this.fireEvent(e.target, 'input');
          });
    }

  // Code for constructor, fireEvent and to setup the mask...
}

carrier.html

<input input-mask="mask.bind: carrier.airbillMask; unmasked-value.bind: airbill" 
       value.bind="formattedAirbill"/>
  

更新:要解决此错误,请更改为unmasked-value.two-way,绑定即可生效。

carrier.ts

@bindable({ defaultBindingMode: bindingMode.twoWay})
carrier: EntityInterfaces.ICarrier;

@bindable({ defaultBindingMode: bindingMode.twoWay })
formattedAirbill: string;

@bindable({ defaultBindingMode: bindingMode.twoWay, changeHandler: 'onAirbillChanged' })
airbill: string;

onAirbillChanged() {
    console.log('Airbill was set!');
}

问题:

数据似乎流入@bindable变量就好了。随着掩码的更改,自定义属性中的值会更改。

但是如果在custom-attribute中进行了更改,它似乎没有流出。

示例场景: 在编辑输入框中的值并退出输入后,focusout事件将触发,并且控制台语句指示已从自定义属性内部更新未屏蔽的值:

  

unmaskedValue从自定义属性

中更新

但是(当输入失去焦点时)当我退出输入框时,控制台语句说car.t文件上的airbill被更新了:

  

这不会触发:
  console.log('Airbill已设置!');

这似乎向我表明,绑定并非真正双向。

问题:

如何双向进行此绑定?那么当我更新自定义属性中的unmaskedValue时,它会更新视图模型中的绑定值吗?

注意:作为一种变通方法,我可以将unmasked-value.bind更改为方法调用(on-unmasked-value-changed.call="onUnmaskedValueChanged($event))并更新该方法中的值。所以我不需要这个工作。但我想知道是否有可能将来使用。

2 个答案:

答案 0 :(得分:0)

此已知错误已于2016年3月15日修复并关闭 https://github.com/aurelia/templating/issues/253#issuecomment-189394955

答案 1 :(得分:-1)

尝试使用默认值初始化变量unmaskedValue。尝试null,undefined,&#39;&#39;等等。我以前做过这个,但我不记得哪个版本(当然是测试版)