2016-08-20 2 views
1

Я проверял следующие угловые 2 одушевленные документы: https://angular.io/docs/ts/latest/guide/animations.htmlУгловое 2 одушевленные

и начал играть с ним. Я пошел на простейшем примере, и сделал следующее:

Добавлен в мой компонент:

animations: [ 
    trigger('dataState', [ 
     state('inactive', style({ 
     backgroundColor: '#eee', 
     transform: 'scale(1)' 
     })), 
     state('active', style({ 
     backgroundColor: '#cfd8dc', 
     transform: 'scale(1.1)' 
     })), 
     transition('inactive => active', animate('100ms ease-in')), 
     transition('active => inactive', animate('100ms ease-out')) 
    ]) 
    ] 

добавлен в шаблон:

<div class="well" 
[@dataState]="data.active" 
(click)="data.toggleState()" style="cursor:pointer"> 
SOME TEXT 
</div> 

Конечно импортированы все, ..

import {Component,OnInit, 
trigger, 
    state, 
    style, 
    transition, 
    animate} from '@angular/core'; 

, но когда я нажимаю на свой объект, я получаю:

browser_adapter.js:86 TypeError: self.context.$implicit.toggleState is not a function 

Поскольку toggleState не в документации, я попытался удалить его, но не было никакого эффекта анимации после всего (хотя нет ошибки)

нет Что мне не хватает?

ответ

2

Значение, присвоенное @dataState через [@dataState]="data.active", может быть либо 'active', либо 'inactive' в вашем примере. (ну, значение могло бы быть другим, но не было бы никакого эффекта, если вы не указали его)

Таким образом, вашему компоненту.ts требуется свойство data.active, которое имеет либо одно значение. Что вызывает анимацию изменение между ними:

[@dataState]="'active'" в [@dataState]="'inactive'" или наоборот

data.active это просто переменная и data.toggleState() это функция, которая присваивает 'active' или 'inactive' к нему.

1

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

Если вы посмотрите на live plunker example и просмотрите код, вы можете увидеть, как он его настроил.

В app/hero.service.ts они добавили конструктор, который добавляет строку hero.state и метод toggleState() в класс Hero.

class Hero { 
    constructor(public name: string, 
       public state = 'inactive') { 
    } 

    toggleState() { 
    this.state = (this.state === 'active' ? 'inactive' : 'active'); 
    } 
} 

на основе вашей ошибки и вопрос, кажется, вы не добавили ни из них в еще поэтому toggleState() не является функцией, и ничто не может быть изменен без государственного атрибута.

Для примера можно (в зависимости от класса) сделать что-то вроде этого:

import { Component, Input, trigger, state, style, transition, animate } from '@angular/core'; 
@Component({ 
    selector: 'basic-component', 
    template: ` 
    <div class="well" [@dataState]="active" (click)="toggleState()" style="cursor:pointer">SOME TEXT</div> 
    `, 
    animations: [ 
    trigger('dataState', [ 
     state('inactive', style({ 
     backgroundColor: '#eee', 
     transform: 'scale(1)' 
     })), 
     state('active', style({ 
     backgroundColor: '#cfd8dc', 
     transform: 'scale(1.5)' 
     })), 
     transition('inactive => active', animate('100ms ease-in')), 
     transition('active => inactive', animate('100ms ease-out')) 
    ]) 
    ] 
}) 
export class BasicComponent { 
    active = 'inactive'; 
    toggleState() { 
    this.state = (this.state === 'active' ? 'inactive' : 'active'); 
    } 
} 
1

Я также нашел документ анимации на angular.io быть неполным. Я использовал код примера и сделал несколько незначительных изменений, чтобы заставить его работать с кодом из их TOH app tutorial.

TL; DR

Добавить state="inactive" свойство к классу hero.ts героя отслеживать состояние анимации каждого героя.

В HTML, изменить способ их связывание с (click)="toggleState(hero)"(click)="hero.toggleState()" и написать этот метод в классе HeroesComponent:

toggleState(hero: Hero) { hero.state = (hero.state === 'active' ? 'inactive' : 'active'); }

Перепроводных onSelect() метод так, что gotoDetail() навигация работает.

Working plunk that follows steps below

Here is the plunker they provide with everything complete through section 5 - routing. Используйте его, чтобы следовать, если вы хотите.

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

Первый код, который они частично вас через в анимации Документах добавить анимированные активные/неактивные состояния для выбранных героев в Heroes просмотра (в отличие от представления приборной панели):

import { Component, Input, trigger, state, animate } from '@angular/core'; 
import { Heroes } from './hero.service'; 
@Component({ 
    moduleId: module.id, 
    selector: 'hero-list-basic', 
    template: ` 
    <ul> 
     <li *ngFor="let hero of heroes" 
      [@heroState]="hero.state" 
      (click)="hero.toggleState()"> 
     {{hero.name}} 
     </li> 
    </ul> 
    `, 
    styleUrls: ['hero-list.component.css'], 
    animations: [ 
    trigger('heroState', [ 
     state('inactive', style({ 
     backgroundColor: '#eee', 
     transform: 'scale(1)' 
     })), 
     state('active', style({ 
     backgroundColor: '#cfd8dc', 
     transform: 'scale(1.1)' 
     })), 
     transition('inactive => active', animate('100ms ease-in')), 
     transition('active => inactive', animate('100ms ease-out')) 
    ]) 
    ] 
}) 
export class HeroListBasicComponent { 
    @Input() heroes: Heroes; 
} 

Выше их (пример анимации) сопоставляет код в app/heroes.component.ts (из plnkr) и обратите внимание, что html/css были извлечены в отдельные файлы на plnkr. Я полагаю, большинство из тех, кто читал это, следовали учебному курсу и знакомы с этим кодом.

heroes.component.html Новая анимация будет в основном копируют существующие привязки на каждом герое <li>, поэтому удалить эти две строк - потому что они будут конфликтовать, если бы мы держали их - мы собираемся довести это функциональность обратно с состояниями анимации.

<ul class="heroes"> 
    <li *ngFor="let hero of heroes"> 

    --------->[class.selected]="hero === selectedHero" 
    --------->(click)="onSelect(hero)"> 

    <span class="badge">{{hero.id}}</span> {{hero.name}} 
    </li> 
</ul> 

новый HTML из примера анимации:

<ul class="heroes"> 
    <li *ngFor="let hero of heroes" 
    [@heroState]="hero.state" 
    (click)="hero.toggleState()"> 
    <span class="badge">{{hero.id}}</span> {{hero.name}} 
    </li> 
</ul> 

Я не хочу, чтобы добавить метод toggleState к классу героя, я хотел его в компонент, который вызывает его. Поэтому я сменил привязку кликов на

(click)="toggleState(hero)" 

и просто передать герою с щелчком метод, который нам еще нужно написать.

hero не обладает свойством state еще так давайте добавим, что в приложение/hero.ts:

добавить state:string = "inactive"; в список свойств.

Теперь давайте вернемся к heroes.component.ts, импортировать наши анимации зависимостей, добавить метаданные анимации в @Component и создать метод toggleState(). Мы хотим сохранить метод onSelect(), который мы удалили из html, мы изменим его и повторно его используем в одно мгновение.

Наверху, замените

import { Component, OnInit } from '@angular/core';

с

import { Component, OnInit, trigger, state, style, transition, animate } from '@angular/core';

Добавление в animations метаданных после styleUrls: [ ... ],:

animations: [ 
    trigger('heroState', [ 
    state('inactive', style({ 
     backgroundColor: '#eee', 
     transform: 'scale(1)' 
    })), 
    state('active', style({ 
     backgroundColor: '#cfd8dc', 
     transform: 'scale(1.1)' 
    })), 
    transition('inactive => active', animate('100ms ease-in')), 
    transition('active => inactive', animate('100ms ease-out')) 
    ]) 
] 

В HeroesComp onent добавить следующий метод:

toggleState(hero: Hero) { 
    hero.state = (hero.state === 'active' ? 'inactive' : 'active'); 
} 

Так что все работает. Теперь давайте раскроем детали героя. Деталь героя немного изменилось после списка, который показывает, какой герой выбран, сопровождаемый кнопкой, которая перемещается по маршруту detail /: id. Но теперь его нет. Метод onSelect(), который мы сняли, запускал это.

Давайте переименовать onSelect() в updateSelectedHero(), а затем вызвать его изнутри toggleState():

updateSelectedHero(hero: Hero): void { 
    this.selectedHero = hero; 
    } 

    toggleState(hero: Hero) { 
    hero.state = (hero.state === 'active' ? 'inactive' : 'active'); 
    this.updateSelectedHero(hero); 
    } 

aaand мы вернулись в бизнесе. Появляется деталь героя, и на кнопке View Details вызывается gotoDetail(). Есть отвратительные недостатки пользовательского интерфейса, которые требуют выглаживания, но вы получаете эту идею.

My finished plunk

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