2015-06-04 21 views
7

Làm cách nào để cho phép Angular truyền các thay đổi mà tôi đã thực hiện cho mô hình. Trong AngularJS điều này sẽ thực sự dễ dàng, nhưng tôi dường như không thể làm cho nó hoạt động trong Angular. Tôi biết toàn bộ hệ thống phát hiện thay đổi và xem truyền bá được thay đổi hoàn toàn. Bằng cách nào đó, tôi cần phải thông báo góc cạnh của những thay đổi. Nhưng làm thế nào tôi có thể làm điều này trong thực tế.Cách cập nhật chế độ xem sau khi thay đổi mô hình trong Angular

Xem đoạn mã này nguyên cảo:

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

Bạn sẽ thấy rằng, sau khi người sử dụng có được nạp vào mô hình, quan điểm không cập nhật.

Tôi đang sử dụng systemjs 0.16, angular 2.0.0-alpha.23.

See this plnkr for the example (hiện tại, chỉ hoạt động trong chrome, như mới 'lấy' api được sử dụng)

Trả lời

2

tôi thấy vấn đề này. Rõ ràng, một lỗi của nó sẽ được sửa trong alpha 27. Xem báo cáo lỗi này: https://github.com/angular/angular/issues/1913

Angular2 sử dụng zonej để biết khi nào bắt đầu chu trình tiêu hóa (kiểm tra bẩn và cập nhật chế độ xem). Hiện tại, zonejs không được kích hoạt sau khi tìm nạp dữ liệu bằng window.fetch() mới.

Thay thế cửa sổ [ 'lấy'] dòng này khắc phục sự cố cho tôi: Zone.bindPromiseFn(window['fetch'])('http://jsonplaceholder.typicode.com/users')

1

Để cập nhật dữ liệu vào xem trong AngularJS2 bạn nên sử dụng hình thức . Bạn có thể đọc về điều này tại số page này hoặc xem thêm chi tiết here. Nếu tôi hiểu hình thức một cách chính xác, bạn nên sửa đổi yout @View phần như thế này:

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

--edited

Hãy thử điều này:

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

Tôi không chắc chắn rằng câu trả lời của tôi là hoàn toàn chính xác, nhưng tôi không thể tìm thêm thông tin. Thử nghiệm với mã này và có thể là Force với bạn! :)

Tôi cũng tìm thấy this link, rất thông tin.

Như tôi hiểu, khi xây dựng, bạn nên khởi tạo users biến qua new Control(some data) và sau đó, trong mẫu xem bạn có thể truy cập vào dữ liệu này như thế này - {{users.value}}.

Nếu nó không hoạt động: hãy thử tương tự nhưng với dữ liệu rất đơn giản, ví dụ: sử dụng chuỗi thay vì một mảng.

this video sẽ giúp xóa biểu mẫu trong ng2.

+0

Liên kết thứ hai của bạn dường như đặt tôi vào đúng đường dẫn, nhưng tài liệu dường như đã lỗi thời. Tôi nghĩ rằng tôi cần một số loại hình thức chỉ thị trong mảng chỉ thị, nhưng tên là gì, và làm thế nào để nhập khẩu nó? – nicojs

+0

@nicojs sẽ cố gắng thực hiện như trong ví dụ về liên kết đầu tiên và nếu nó không hoạt động, hãy làm như trong phần thứ hai. Tên chỉ thị cho 'forms' - chỉ thị: [forms] hoặc có thể [Forms]. Nhập khẩu nó như bạn nhập [For] chỉ thị. Hãy thử điều này và báo cáo xin vui lòng, tôi cố gắng giúp bạn nhiều hơn nữa. –

+0

Tôi đã thử tất cả, nhưng nó không hoạt động. Tôi nghĩ chúng ta đang đi sai hướng. Theo tôi biết, angular2 vẫn sử dụng kiểm tra bẩn để xem liệu mô hình có bị thay đổi hay không. Bằng cách nào đó tôi cần phải thông báo cho angular2 rằng tôi đã cập nhật mô hình. Hoặc sử dụng $ http tương đương. – nicojs

-2

Ng tiền tố quay lại. For hiện đã trở thành ngFor cho phiên bản Angular2 alpha-24 +.

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

Sau đó, sử dụng *ng-for=#user of users" trong mẫu.

Thanh toán các ngFor docs hoặc a working example

+0

Vấn đề không phải là Đối với, nó hoạt động chính xác. Đó là lý do tại sao tôi chỉ định rằng tôi đang sử dụng alpha-22. Nhưng tại thời điểm angular2 đang đánh giá chế độ xem, mảng người dùng vẫn còn trống. Vấn đề là angular2 không được thông báo về những thay đổi trong mô hình sau khi tìm nạp xong. Theo tôi biết, angular2 không sử dụng Object.observe, nhưng vẫn sử dụng kiểm tra bẩn để kiểm tra các thay đổi. Vì vậy, nó không biết về những thay đổi trong khung nhìn. Trong góc 1.x bạn sẽ sử dụng $ http, hoặc thậm chí $ áp dụng. Có tương đương angular2 không? – nicojs

+0

Với mã alpha bạn có thể muốn xem xét gắn bó với phiên bản mới nhất để tránh nhiều lỗi hơn và các tính năng không đầy đủ. Trong Angular2 không có $ áp dụng, cũng không cần thiết, xem nên chỉ cập nhật dựa trên mô hình. Thay vì $ http, bạn có thể sử dụng bất kỳ phương thức yêu cầu nào trong ng2. Xem [phản hồi này] (http://stackoverflow.com/questions/28910864/angular-2-how-to-use-import-the-http-module) từ người sáng tạo của Angular. – shmck

+0

Ok, không cần áp dụng $. Nhưng phải có một số cách để thông báo cho việc phát hiện thay đổi các thay đổi của tôi. Nó sẽ không bình chọn cho nó, cũng không phải là nó sử dụng Object.observe. Vậy làm thế nào để tôi sửa lỗi này? – nicojs

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