javascript - 如何知道 Aurelia 中的 valueChanged 来源?

标签 javascript aurelia

我在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/

相关文章:

javascript - 在 JavaScript 中应用时区后获取日期的组成部分

javascript - jquery分页插件的使用方法

javascript - 如何在 $(document).ready 函数中添加多个函数

function - Aurelia repeat.for 多次调用函数

javascript - Aurelia 中 View 模型之间的接口(interface)

javascript - 引用错误: Client is not defined Discord JS error

javascript - d3有没有类似jQuery.closest(selector)的api?

html - 在 Aurelia 中使用 HTML 中的 Numeral.js

node.js - Aurelia bundle 和 jspm 配置文件

twitter-bootstrap - 无法观察 Aurelia 自定义属性中的 Bootstrap 事件