Как обновить представление после изменения модели в Angular?

Как я могу позволить угловому распространению изменений, которые я сделал для модели. В AngularJS это было бы очень легко, но я не могу заставить его работать в Angular. Я знаю, что вся система обнаружения изменений и распространение вида полностью изменены. Так или иначе, мне нужно сообщить angular об изменениях. Но как я могу сделать это на практике.

см. этот фрагмент кода typescript:

import {Component, View, bootstrap, For} from 'angular2/angular2';

// Annotation section
@Component({
    selector: 'app'
})
@View({
    template: `
    <div *for="#user of users">
        {{user}}
    </div>
    `,
    directives: [For]
})
class App {
    users:Array<String>;

    constructor() {
        this.users = [];
        this.fillUsersAsync();
    }

    fillUsersAsync(){
        window['fetch']('http://jsonplaceholder.typicode.com/users')
            .then( resp => resp.json())
            .then( users => users.forEach(user => this.users.push(user.name)))
            .then( () => console.log('Retrieved users and put on the model: ', this.users));
    }
}

bootstrap(App);

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

Я использую systemjs 0.16, angular 2.0.0-alpha.23.

см. этот plnkr для примера (в настоящее время работает только в chrome, так как используется новый api "fetch")

4 ответов


Я нашел проблему. По-видимому, его ошибка будет исправлена в alpha 27. См. этот отчет об ошибке:https://github.com/angular/angular/issues/1913

Angular2 использует zonejs, чтобы знать, когда начинать цикл дайджеста (грязная проверка и обновление представления). На данный момент zonejs не запускается после извлечения данных в новом окне.привести.)(

замена строки window ['fetch'] на эту Исправлена проблема для меня: Zone.bindPromiseFn(window['fetch'])('http://jsonplaceholder.typicode.com/users')


чтобы обновить данные при просмотре в AngularJS2, вы должны использовать формы. Вы можете прочитать об этом на этом страница или посмотреть подробнее здесь. Если я правильно понимаю формы, вы должны изменить yout @View часть такой:

@View({
    template: `
    <div *for="#user of users" control="users">
        {{user}}
    </div>
    `,
    directives: [For]
})

-- edited

попробуйте это:

import {Component, View, bootstrap, For} from 'angular2/angular2';

// Annotation section
@Component({
    selector: 'app'
})
@View({
    template: `
    <div [control]="users" *for="#user of users">
        {{user.value}}
    </div>
    `,
    directives: [For, forms]
})
class App {
    users:Array<String>;

    constructor() {
        this.users = new Control([]);
        this.fillUsersAsync();
    }

    fillUsersAsync(){
        window['fetch']('http://jsonplaceholder.typicode.com/users')
            .then( resp => resp.json())
            .then( users => 
                var usersArr = []
                users.forEach(user => 
                      usersArr.push(user.name))
                this.users = new Control(usersArr));
        }
 }

 bootstrap(App);

Я не уверен, что мой ответ полностью правильный, но я не могу найти больше информации. Поэкспериментируйте с этим кодом и да пребудет с тобой Сила! :)

также я нашел этой ссылке, очень познавательно.

как я понимаю, когда в конструкторе вы должны инициализировать ь users переменной через new Control(some data) и затем, в view template вы можете получить доступ к этим данным, как это -{{users.value}}.

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

и видео помогает unserstand форм в нг2.


просто ответил на вот это Angular2 Вид Не Меняется После Обновления Данных

в основном, была ошибка в бета-версии 2.0.0-beta.1.

надеюсь, что это помогает!


НГ-префиксы обратно. For стала ngFor для Angular2 версий alpha-24+.

import {NgFor} from 'angular2/directives';
@View({
  directives: [ngFor]
})

затем использовать *ng-for=#user of users" в шаблоне.

оформить заказ ngFor docs или пример работающего