2015-10-16 18 views
13

Próbuję zacząć od kąta 2.0, teraz zastanawiałem się, jak mogę zainicjować aktualizację widoku po jakimś zewnętrznym zdarzeniu zmienionym danych.

W szczegółach mam mapę google i przewodnik po zdarzeniu typu kliknięcie na mapie. Gdy użytkownik kliknie na mapie przechowywać długość i szerokość geograficzną kliknięcie w zmiennych w sterowniku

this.lat = event.latLng.lat(); 
this.lon = event.latLng.lon(); 

w widoku chcę, aby wyświetlić te wartości

<div> this is my spot: {{lat}} and {{lon}} </div> 

W kątowej 1 I po prostu zawiń zadanie w kontrolerze w wywołaniu $ scope. $ apply().

Jaki jest preferowany sposób aktualizowania widoków w angluar 2.0?

Odpowiedz

13

Przeważnie, nie trzeba robić nic, aby zaktualizować widok. zone.js zrobi wszystko za Ciebie.

Ale jeśli z jakiegoś powodu chcesz uruchomić ręczne wykrywanie zmiany ognia (na przykład, jeśli twój kod działa poza strefą kątową), możesz użyć do tego metody LifeCycle::tick(). Zobacz this plunker

import {Component, LifeCycle, NgZone} from 'angular2/angular2' 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     Hello world!!! Time: {{ time }}. 
    </div> 
    ` 
}) 
export class App { 
    time: number = 0; 

    constructor(lc: LifeCycle, zone: NgZone) { 
    zone.runOutsideAngular(() => { 
     setInterval(() => { 
     this.time = Date.now(); 

     lc.tick(); // comment this line and "time" will stop updating 
     }, 1000); 
    }) 
    } 
    doCheck() { 
    console.log('check', Date.now()); 
    } 
} 
+0

dzięki! Wygląda na to, że znajdowałem się poza strefą kątową (wewnątrz kliknięcia-oddzwaniania mapy google). Wywołanie lc.tick() dało podstęp :-) –

+3

Hmm, może ['NgZone: run'] (https://github.com/angular/angular/blob/2.0.0-alpha.44/modules/angular2 /src/core/zone/ng_zone.ts#L212) jest bardziej odpowiedni dla twojego przypadku użycia. Realizuje wywołanie zwrotne wewnątrz strefy kątowej, po wykonaniu uruchamia LifeCycle.tick(). – alexpods

+0

I agrre with @alexpods. Jest inne pytanie, które rozwiązuje to w ten sposób, z 'NgZone: run' (http://stackoverflow.com/questions/31352397/how-to-update-view-after-change-in-angular--2-after-google-event- listener-fired) – EuAndreh

30

próby importowania ChangeDetectorRef z kątowym rdzenia jak postępować

import {Component, ChangeDetectorRef} from 'angular2/core'; 

w konstruktorze

constructor(private chRef: ChangeDetectorRef){ 
    chRef.detectChanges(); //Whenever you need to force update view 
} 
+1

w nowych wersjach kątowych jest 'import {Component, ChangeDetectorRef} from '@ angle/core';' – Luckylooke