2015-07-25 1 views
6

Я использую Aurelia.js для своего интерфейса. Предположим, у меня есть следующая наглядная разметка:Aurelia.js: Как мне изменить элемент при изменении значения привязки?

<tr repeat.for="item in items"> 
    <td>${item.name}</td> 
    <td>${item.value}</td> 
</tr> 

которая привязана к модели «предметов». Когда одно из значений в модели изменяется, я хочу анимировать ячейку, где отображается измененное значение. Как я могу это сделать?

+0

Как данные изменения? Какие изменения есть? – dfsq

+0

@dfsq View model получает его из websocket и обновляет элемент в поле «items». Затем привязка Aurelia обновляет DOM. – Mikhail

+0

Вам необходимо использовать модуль aurelia-animator-css. Я создам пример позже, если вы не поймете это сами. – dfsq

ответ

7

Это может быть сделано с Aurelia custom attributes функции.

Создание нового файла JavaScript для описания атрибута (я назвал атрибут «animateonchange»):

import {inject, customAttribute} from 'aurelia-framework'; 
import {CssAnimator} from 'aurelia-animator-css'; 

@customAttribute('animateonchange') 
@inject(Element, CssAnimator) 
export class AnimateOnChangeCustomAttribute { 
    constructor(element, animator) { 
     this.element = element; 
     this.animator = animator; 
     this.initialValueSet = false; 
    } 

    valueChanged(newValue){ 
     if (this.initialValueSet) { 
      this.animator.addClass(this.element, 'background-animation').then(() => { 
       this.animator.removeClass(this.element, 'background-animation'); 
      }); 
     } 
     this.initialValueSet = true; 
    } 
} 

Он принимает элемент и CSS аниматора в конструкторе. Когда значение изменяется, оно анимирует элемент с предопределенным именем класса CSS. Первое изменение игнорируется (нет необходимости анимировать при начальной загрузке). Вот как использовать этот пользовательский элемент:

<template> 
    <require from="./animateonchange"></require> 
    <div animateonchange.bind="someProperty">${someProperty}</div> 
</template> 

Посмотреть полный пример in my blog или on plunkr

5

Создатель сумасшедшей Aurelia-CSS-аниматор здесь :)

Для того, чтобы сделать то, что вы хотите, вам просто нужно достать DOM-элемент, а затем использовать метод анимировать Аурелии. Поскольку я не знаю, как вы собираетесь редактировать элемент, я просто использовал тайм-аут внутри виртуальной машины, чтобы имитировать его.

attached() { 
    // demo the item change 
    setTimeout(() => { 
    let editedItemIdx = 1; 

    this.items[editedItemIdx].value = 'Value UPDATED'; 
    console.log(this.element); 
    var elem = this.element.querySelectorAll('tbody tr')[editedItemIdx]; 

    this.animator.addClass(elem, 'background-animation').then(() => { 
     this.animator.removeClass(elem, 'background-animation') 
    }); 
    }, 3000); 
} 

Я создал небольшой планшет, чтобы продемонстрировать, как это может работать. Обратите внимание, что это старая версия, не содержащая последний экземпляр аниматора, поэтому вместо анимации я использую addClass/removeClass вместе.

http://plnkr.co/edit/7pI50hb3cegQJTXp2r4m

Также см на официальный блог, с большим количеством намеков http://blog.durandal.io/2015/07/17/animating-apps-with-aurelia-part-1/

Надеется, что это помогает

+1

Спасибо, сумасшедший создатель. Я заработал. Разве вы не считаете этот способ слишком многословным и хакерским? Для меня это не работает по отношению к намерению Aurelia производить чистый код. Я бы ожидал какого-то простого синтаксиса со связью/событием/безотносительно к прямым манипуляциям с DOM ... И ссылка plunkr кажется просто Hello World, я не вижу никакой анимации там – Mikhail

+0

ну нет на самом деле никаких манипуляций DOM участвует. Все, что вам нужно - это элемент, который вы хотите оживить. Есть альтернативные пути к этому, например, использование атрибута ref, но приведенный выше пример был просто изображен, так как я не знал ваших точных требований. Я бы рекомендовал либо создать более конкретный вопрос SO, либо присоединиться к Aurelia Gitter, чтобы обсудить его, а затем внести ответ обратно в SO. Plunkr будет анимировать второй элемент в списке через 3 секунды, изменив его цвет фона. – zewa666

+0

Мы делаем селектор запросов, поэтому мы используем html в VM, и он изменится, если я изменил представление. В моем случае мне нужно выбрать ячейку, поэтому еще более жесткий селектор. Пример setTimeout отображает почти 1 на 1 в соответствии с моими требованиями, поэтому нет необходимости в новом вопросе. Я скопировал свой вопрос на gitter, ответа пока. И plunkr не имеет 2-го элемента, просто Hello world, я думаю, что я не могу нажать на ссылку или что-то подобное. – Mikhail