我在Aurelia
中创建了一个自定义元素我还有valueChanged
,但是只有当 value
时我才需要执行特定操作在自定义元素之外更改。由于签名是 valueChanged(newValue, oldValue)
,我怎么知道值何时从 ViewModel
发生变化?而不是来自自定义元素本身?这可以通过observer
以某种方式实现吗?或observable
?
我实际上得到了一个工作样本,我看到还有一个 __array_observer__
属性时value
更改为 ViewModel
,它确实有效,但可能并不理想。所以我得到了这段可以工作的代码
valueChanged(newValue, oldValue) {
if (newValue !== oldValue && newValue.__array_observer__) {
// value got changed outside of this custom element
}
}
但这可能并不理想,不是吗?关于了解value
在哪里的任何其他建议在自定义元素之外发生了更改?
编辑
我正在尽可能寻找一种仍然可以访问自定义元素的解决方案。即使我想由外部值更改调用触发,我仍然需要调用同一自定义元素的内部函数。
编辑#2
为了对我的问题进行更多描述,我需要知道 value
何时出现从外部更改,因为这将触发重新影响 value
的操作。在不知道更改是否来自自定义元素外部的情况下,我陷入了递归调用,无法阻止它。我正在寻找的内容与以前的caller
类似。和 callee
但这在 ES5 和严格模式中被删除了,不过这会非常有用。
仍在寻找答案:(
最佳答案
您可以使用CustomBindingBehavior来拦截updateTarget
事件。例如:
export class InterceptBindingBehavior {
bind(binding, scope, interceptor) {
binding['originalUpdateTarget'] = binding['updateTarget'];
binding.updateTarget = val => {
alert('property was changed outside of the element');
//do something here
binding['originalUpdateTarget'](val);
}
}
unbind(binding, scope) {
binding.updateTarget = binding['originalUpdateTarget'];
binding['originalUpdateTarget'] = null;
}
}
用法:
<template>
<require from="./intercept-binding-behavior"></require>
<some-element value.bind="message & intercept"></some-element>
</template>
可运行示例:https://gist.run/?id=bcd7d39ed94856caf586f224f89fd1ff
我在很多情况下都没有测试过这一点,我不确定这是否是最好的方法。
如果您想要执行相反的操作(当从元素而不是 VM 更改属性时进行拦截),只需将 updateTarget
替换为 updateSource
。
有关 CustomBindingBehaviors 的更多信息 http://aurelia.io/hub.html#/doc/article/aurelia/binding/latest/binding-binding-behaviors/8
希望这有帮助!
关于javascript - 如何知道 Aurelia 中的 valueChanged 来源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44955064/