2016-07-28 2 views
1

Есть ли какие-либо аналоги функции $ apply или $ digest в Aurelia? Как сразу вызвать изменения 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) Пожар моего события «toggle-agents» 3) Подписчик поймать мое событие (пересчитать высоту) 4) В глубине Aurelia ObserverLocator обновить мое (видимое свойство) в DOM и изменениях высоты.

мне нужно: 1) this.current.children [I] = .Visible ложно (при Распад узел) 2) В глубине, на Aurelia ObserverLocator обновить (видимое свойство) в DOM и изменения высоты. 3) Пожар моего пользовательского события. 4) Подписчик поймает мое событие и пересчитает высоту, когда фактическое изменение высоты.

ответ

2

В Aurelia изменения применяются в большинстве случаев. Aurelia использует только грязную проверку вычисляемых свойств (свойства с функцией геттера). Если вы хотите, чтобы вызвать вручную грязную-проверку, вы могли бы сделать что-то вроде этого:

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 
    } 
} 

На практике такого рода вещи никогда не нужно в приложении Аурелия. Если у вас есть конкретные привязки, которые вы хотите, чтобы заставить обновить вы можете использовать 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()) или событиях с изменением языка интернационализации ... вы, возможно, не делаете это «способом Aurelia».

+0

Я пробовал использовать сигнальную технику, но это не дало результатов. Может быть, я делаю что-то неправильно. Я добавлю описание своего дела. –

Смежные вопросы