2015-06-04 8 views
7

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

Посмотреть этот кусок кода: машинопись

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, угловой 2.0.0-alpha.23.

See this plnkr for the example (в настоящее время работает только в хроме, так как используется новый «выборки» апи)

ответ

2

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

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

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

1

Для обновления данных в целях в AngularJS2 следует использовать Формы. Вы можете прочитать об этом на этом page или посмотреть подробности here. Если я понимаю правильно формы, вы должны изменить 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); 

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

Также я нашел this link, очень информативный.

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

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

И this video поможет не выдавать формы в ng2.

+0

Ваша вторая ссылка, кажется, поместила меня на правильный путь, но документ кажется устаревшим. Я думаю, что мне нужна директива формы в массиве директив, но каково имя и как его импортировать? – nicojs

+0

@nicojs посоветует сделать так, как в примере с первой ссылкой, и если это не сработает, сделайте это во втором. Название директивы для 'forms' - директив: [forms] или, возможно, [Forms]. Импортируйте его, как вы импортируете директиву [For]. Попробуйте это и сообщите, пожалуйста, я стараюсь помочь вам больше. –

+0

Я пробовал все, но он не работает. Я думаю, что мы смотрим в неправильном направлении. Насколько я знаю, angular2 все еще использует грязную проверку, чтобы увидеть, изменилась ли модель. Как-то мне нужно сообщить angular2, что я обновил модель. Или используйте эквивалент $ http. – nicojs

-2

Ng-префиксы вернулись. For теперь стал ngFor для версий Angular2 alpha-24 +.

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

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

ngFor docs Извлекает или a working example

+0

Проблема не в том, что она работает правильно. Вот почему я указал, что использую альфа-22. Но в момент, когда angular2 оценивает представление, массив пользователей по-прежнему пуст. Проблема заключается в том, что angular2 не сообщается об изменениях в модели после выполнения выборки. Насколько я знаю, angular2 не использует Object.observe, но по-прежнему использует грязную проверку для проверки изменений. Поэтому он не знает об изменениях в представлении. В угловом 1.x вы будете использовать $ http или даже $ apply. Есть ли угловой эквивалент? – nicojs

+0

С альфа-кодом вы можете подумать о том, чтобы придерживаться последней версии, чтобы избежать лишних ошибок и неполных функций. В Angular2 нет $ apply и не нужно, представление должно просто обновляться на основе модели. Вместо $ http вы можете использовать любой метод запроса в ng2. См. [Этот ответ] (http://stackoverflow.com/questions/28910864/angular-2-how-to-use-import-the-http-module) от создателя Angular. – shmck

+0

Ок, не требуется $ apply. Но должен быть какой-то способ сообщить об изменении моих изменений. Он не будет опросить его и не использует Object.observe. Так как я могу это исправить? – nicojs

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