2015-07-25 16 views
6

Tôi đang sử dụng Aurelia.js cho giao diện người dùng của mình. Giả sử tôi có đánh dấu chế độ xem sau:Aurelia.js: Làm cách nào để tạo hiệu ứng cho một phần tử khi giá trị bị ràng buộc thay đổi?

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

Được gắn với một "mặt hàng" mô hình. Khi một trong các giá trị trong mô hình thay đổi, tôi muốn tạo hiệu ứng động cho ô nơi giá trị thay đổi được hiển thị. Làm thế nào tôi có thể thực hiện điều này?

+0

Làm thế nào để thay đổi dữ liệu? Những thay đổi là gì? – dfsq

+0

@dfsq Xem mô hình nhận được từ websocket và cập nhật một mục trong trường "mục". Sự ràng buộc của Aurelia sau đó cập nhật DOM. – Mikhail

+0

Bạn cần sử dụng mô-đun aurelia-animator-css. Tôi sẽ tạo một ví dụ sau nếu bạn không tự mình tìm ra. – dfsq

Trả lời

7

Điều này có thể được thực hiện với Aurelia custom attributes tính năng.

Tạo một file javascript mới để mô tả các thuộc tính (tôi gọi là thuộc tính "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; 
    } 
} 

Nó nhận các yếu tố và CSS làm phim hoạt hình trong constructor. Khi giá trị thay đổi, nó sẽ sinh động phần tử với tên lớp CSS được xác định trước. Thay đổi đầu tiên bị bỏ qua (không cần phải hoạt ảnh khi tải ban đầu). Dưới đây là làm thế nào để sử dụng yếu tố tùy chỉnh này:

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

Xem ví dụ hoàn chỉnh in my blog hoặc on plunkr

5

Các tác giả của điên Aurelia-CSS-Animator qua đây :)

Để làm được những gì bạn muốn, bạn chỉ cần có được giữ của DOM-Yếu tố và sau đó sử dụng phương pháp Animate Aurelia của. Vì tôi không biết làm thế nào bạn sẽ chỉnh sửa một mục, tôi đã chỉ sử dụng một thời gian chờ bên trong máy ảo để mô phỏng nó.

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

Tôi đã tạo một tài liệu nhỏ để chứng minh cách thức hoạt động. Lưu ý đây là một phiên bản cũ, không chứa phiên bản trình diễn hoạt hình mới nhất, vì vậy thay vì tạo hiệu ứng động, tôi đang sử dụng addClass/removeClass cùng nhau.

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

Ngoài ra hãy xem tại bài viết trên blog chính thức, với nhiều gợi ý http://blog.durandal.io/2015/07/17/animating-apps-with-aurelia-part-1/

Hope this helps

+1

Cảm ơn bạn, người sáng tạo điên rồ. Tôi đã làm việc đó. Bạn không tìm thấy cách làm phim hoạt hình quá chi tiết và hacky? Đối với tôi, nó không hoạt động theo ý định của Aurelia để tạo ra mã sạch. Tôi sẽ mong đợi một số cú pháp đơn giản với ràng buộc/sự kiện/bất cứ điều gì thay vì các thao tác DOM trực tiếp ... Và liên kết plunkr dường như chỉ là Hello World, tôi không thấy bất kỳ hoạt ảnh nào ở đó – Mikhail

+0

cũng không thực sự có bất kỳ thao tác DOM nào có tính liên quan. Tất cả những gì bạn cần là phần tử bạn muốn tạo hiệu ứng động. Có những cách thay thế cho điều này như sử dụng thuộc tính ref, nhưng ví dụ trên chỉ được mô tả vì tôi không biết yêu cầu chính xác của bạn. Tôi khuyên bạn nên tạo một câu hỏi SO cụ thể hơn hoặc tham gia Aurelia Gitter để thảo luận về nó và sau đó đóng góp câu trả lời cho SO. Plunkr sẽ tạo hoạt ảnh cho phần tử thứ 2 trong danh sách ngay sau 3 giây bằng cách thay đổi màu nền của nó. – zewa666

+0

Chúng tôi làm bộ chọn truy vấn, vì vậy chúng tôi sử dụng html trong VM và sẽ bị hỏng nếu tôi thay đổi chế độ xem. Trong trường hợp của tôi, tôi cần phải chọn một ô, do đó, thậm chí chọn cứng nhắc hơn. setTimeout ví dụ bản đồ gần như 1-on-1 để yêu cầu của tôi, do đó, không cần trong câu hỏi mới. Tôi đã sao chép câu hỏi của tôi để gitter, không có câu trả lời cho đến nay. Và plunkr không có phần tử thứ 2, chỉ là Hello world, tôi đoán là tôi không nhấp vào liên kết hay smth. – Mikhail

Các vấn đề liên quan