2016-11-07 26 views
9

Sử dụng góc 2, liên kết hai chiều rất dễ dàng trong các mẫu định hướng - bạn chỉ cần sử dụng cú pháp hộp chuối. Làm thế nào bạn sẽ sao chép hành vi này trong một hình thức theo định hướng mô hình?Hai chiều ràng buộc trong các hình thức phản ứng

Ví dụ: dưới đây là biểu mẫu phản ứng chuẩn. Hãy giả vờ nó phức tạp hơn nhiều so với vẻ bề ngoài, với rất nhiều đầu vào và logic nghiệp vụ khác nhau, và do đó thích hợp hơn cho phương pháp tiếp cận theo mô hình so với cách tiếp cận theo khuôn mẫu.

export class ExampleModel { 
    public name: string; 
    // ... lots of other inputs 
} 

@Component({ 
    template: ` 
     <form [formGroup]="form"> 
      <input type="text" formControlName="name"> 
      ... lots of other inputs 
     </form> 

     <h4>Example values: {{example | json}}</h4> 
    ` 
}) 
export class ExampleComponent { 
    public form: FormGroup; 
    public example: ExampleModel = new ExampleModel(); 

    constructor(private _fb: FormBuilder) { 
     this.form = this._fb.group({ 
      name: [ this.example.name, Validators.required ] 
      // lots of other inputs 
     }); 
    } 

    this.form.valueChanges.subscribe({ 
     form => { 
      console.info('form values', form); 
     } 
    }); 
} 

Tôi có thể áp dụng tất cả các loại logic cho giá trị biểu mẫu và ánh xạ chúng khi cần thiết. Tuy nhiên, tôi không muốn ánh xạ mọi giá trị đầu vào từ biểu mẫu. Tôi chỉ muốn xem các giá trị cho toàn bộ mô hình employee khi nó cập nhật, theo cách tiếp cận tương tự như [(ngModel)]="example.name" và được hiển thị trong đường ống json trong mẫu. Làm thế nào tôi có thể thực hiện điều này?

Trả lời

23

Bạn có thể sử dụng [(ngModel)] với biểu mẫu Phản hồi.

<form [formGroup]="form"> 
    <input name="first" formControlName="first" [(ngModel)]="example.first"/> 
    <input name="last" formControlName="last" [(ngModel)]="example.last"/> 
</form> 

export class App { 
    form: FormGroup; 
    example = { first: '', last: '' }; 

    constructor(builder: FormBuilder) { 
    this.form = builder.group({ 
     first: '', 
     last: '' 
    }) 
    } 
} 

Plunker

này sẽ chỉ thị hoàn toàn khác so với cái mà sẽ được sử dụng mà không cần các formControlName. Với các hình thức phản ứng, nó sẽ là FormControlNameDirective. Nếu không có formControlName, chỉ thị NgModel sẽ được sử dụng.

+4

hỏi một câu hỏi tương tự trong Angular/Angular và hai trong số các nhà phát triển cốt lõi nói với tôi rằng việc trộn biểu mẫu ngModel và phản ứng là một ý tưởng tồi. Bạn sẽ có thể nhận được các giá trị với {{this.form.get ('first'). Value}} – Zuriel

+0

@Zuriel nhưng làm thế nào tôi có thể bin modeldata cục bộ của tôi trực tiếp vào biểu mẫu của tôi vì vậy tôi đã hai cách databinding cho modeldata của tôi ? Bởi vì không có giải pháp trên, tôi cần ánh xạ biểu mẫu của mình trở lại modeldata – squadwuschel

+4

https://angular.io/guide/reactive-forms Để phù hợp với mô hình phản ứng, thành phần bảo toàn tính không thay đổi của mô hình dữ liệu, xử lý nó như một nguồn thuần túy của các giá trị ban đầu. Thay vì cập nhật trực tiếp mô hình dữ liệu, thành phần này trích xuất các thay đổi của người dùng và chuyển chúng tới một thành phần hoặc dịch vụ bên ngoài, thực hiện điều gì đó với chúng (chẳng hạn như lưu chúng) và trả về mô hình dữ liệu mới cho thành phần phản ánh trạng thái mô hình được cập nhật. – Zuriel

1

Đôi khi bạn có thể cần kết hợp [(ngModel)] với biểu mẫu Phản ứng. Tôi có thể là một số inputcontrol mà bạn không cần như là một phần của hình thức, nhưng bạn vẫn cần nó để được ràng buộc với bộ điều khiển. Sau đó, bạn có thể sử dụng: [(ngModel)]="something" [ngModelOptions]="{standalone: true}"

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