Aurelia中的类似物$ apply或$ digest(Angular)

时间:2016-07-28 11:05:54

标签: javascript aurelia aurelia-binding

Aurelia是否有类似函数$ apply或$ digest? 如何立即调用更改bindingValue?

我的情况: 我有树(每个节点包含项目列表,屏幕1)。我有父组件(名称:树)和节点组件(名称:节点)。 每个节点都有一个切换按钮。当我切换我的项目时,父组件应该知道如何更改内容高度。

toggleNode(event) {
    for (var i = 0, length = this.current.children.length; i < length;  i++) {
        this.current.children[i].visible = !this.current.children[i].visible;
    }
   //some code 
   this.evAggregator.publish("toggle-agents", event);
}

查看:

<ol show.bind="current.visible">//Some markup</ol>         

我的父组件捕获此事件并检查内容大小:

@autoinject
export class Agents {
  constructor(private evAggregator: EventAggregator) {
    this.toggleAgentsSubscriber = this.evAggregator.subscribe("toggle-  agents", (e) => {
      //some code for recalculate content height
    });
  }

}

现在代码执行:   1)this.current.children [i] .visible = false(当节点崩溃时)   2)解雇我的活动&#34; toggle-agents&#34;   3)订阅者捕获我的事件(重新计算高度)   4)深入了解Aurelia ObserverLocator在DOM和高度变化中更新我的(可见属性)。

我需要:   1)this.current.children [i] .visible = false(当节点崩溃时)   2)深入Aurelia ObserverLocator更新我的(可见属性)DOM和高度变化。   3)解雇我的自定义事件。   4)订阅者捕获我的事件并在高度内容实际发生变化时重新计算高度。

1 个答案:

答案 0 :(得分:2)

在Aurelia,大部分时间都会立即应用更改。 Aurelia仅对计算属性(具有getter函数的属性)使用脏检查。如果你想手动调用脏检查,你可以这样做:

import {DirtyChecker} from 'aurelia-binding';
import {inject} from 'aurelia-dependency-injection';

@inject(DirtyChecker)
export class Foo {
  constructor(dirtyChecker) {
    dirtyChecker.check(); // force an application-wide dirty check
  }
}

在实践中,Aurelia应用程序永远不需要这种东西。如果您要强制更新特定绑定,则可以使用signal绑定行为:

<template>
  <label>${foo & signal:'my signal name'}</label>
</template>
import {BindingSignaler} from 'aurelia-templating-resources';
import {inject} from 'aurelia-dependency-injection';

@inject(BindingSignaler)
export class Foo {
  constructor(signaler) {
    signaler.signal('my signal name'); // evaluate any bindings with 'my signal name'
  }
}

如果可以的话,尽量远离这两种技巧。如果您将此用于除基于时间的绑定(绑定到使用Date.now()new Date()的内容)或国际化语言环境更改事件之外的其他内容...您可能不会这样做&#34; Aurelia方式&#34;。