2017-08-20 7 views
1

私はAngles(4)on Railsアプリケーションで作業していて、CRUD機能を終了しようとしています。私はフロントエンドの面で「編集」を扱う方法についていません。Angular4フォームビルダダイナミック

ボタンをクリックしたときにロジックを手動でテストしましたが、フォームを事前に入力するのが苦労しています。

提案フロー

  • ユーザーgetClients()機能を実行Clientsをクリックします。
  • Clientsページには、clients/:idページに移動するクライアントごとにIDがクリック可能です。
  • clients/:idparams['id']
  • 形態でgetClientById()機能通過が

マイ・コンポーネントを実行しているeditClientByIdに提出された情報

  • で事前移入され実行

    @Component({ 
        selector: 'app-client-index', 
        templateUrl: './client-index.component.html', 
        styleUrls: ['./client-index.component.sass'] 
    }) 
    export class ClientIndexComponent implements OnInit { 
        constructor(private clientService: ClientService, 
           private activatedRoute: ActivatedRoute, 
           private fb: FormBuilder 
    ) { } 
        public indexForm: FormGroup; 
        public submitted: boolean; 
        public events: any[] = []; 
        client = Client; 
    
        ngOnInit() { 
        this.activatedRoute.params.subscribe((params: Params) => { 
         let id = params['id']; 
         this.clientService.getClientById(params['id']); 
         this.indexForm = new FormGroup({ 
         name: ['', <any>Validators.required], 
         status: [''], 
         logo: [''] 
        }); 
        } 
        } 
    
    
        edit(model: Client, isValid: boolean) { 
        this.submitted = true; 
    
        console.log(model, isValid); 
        } 
    
    
    
        // demo(){ 
        // console.log('pressed'); 
        // this.clientService.editClientById({ 
        //  'id': 4, 
        //  'name': 'Demo User2222', 
        //  'status': 'This', 
        //  'logo': "Test" 
        // }) 
        // } 
    
    } 
    

    サービス

    getClientById(id): Observable<Client> { 
        return this.authToken.get('clients/' + id) 
         .map(res => res.json()) 
         .catch((error: any) => Observable.throw(error.json().error || 'Server error')); 
        } 
    
    
        editClientById(client:any): Observable<Client> { 
        return this.authToken.patch('clients/' + client.id, client) 
         .map(res => res.json()) 
         .catch((error: any) => Observable.throw(error.json().error || 'Server error')); 
        } 
    

    現在ngOnInit機能は、私は夫婦SO記事や私が見てきたスコッチのチュートリアルに基づいてしようとしているものです。これまで私が得た最も近いものは、APIに送信ボタンpatchを送信していましたが、フィールドにあらかじめ入力していませんでした。

    現在の設定では、まったく動作していません。 ngOnInitのロードが完了する前に私のgetClientByIdが実行されているか、まったく機能しているかどうかは分かりません。

    私はモデルにバインドする必要があると思いますが、なんとなくわかりません。

  • +0

    なぜフォームにデータが入力されると思いますか?リクエストが終了する(またはトリガーするためにサブスクライブする)のを待って、フォームを空にするよう明示的に設定します。 – jonrsharpe

    +0

    @jonrsharpeこれは完全に公正な点であり、本質的に私が問題を抱えているところです。私が 'status:[this.client.status] 'の効果を得るために何かすると、私はそれがローディング・レートによるものと思うようになったプロパティ・エラーを取得します。 – DNorthrup

    +0

    なぜローディング・レートが重要なのでしょうか? 'this.client'に何も割り当てません。 – jonrsharpe

    答えて

    0

    サービスでgetClientByIdを呼び出した結果を購読し、結果を取得してpatchValueを使用して、取得したクライアントオブジェクトのフィールドをフォームフィールドに配置する必要があります。

    あなたのサービス呼び出しの結果に加入し、その後、最初のフォームのために構築します。例えば

    (ちょうどこれをタイプし、テストしていません...)

    this.indexForm = new FormGroup({ 
         name: ['', <any>Validators.required], 
         status: [''], 
         logo: [''] 
    ); 
    this.clientService.getClientById(params['id']).subscribe(client => { 
        this.indexForm.patchValue({ 
    name: client.name, 
    status: client.status, 
    logo: client.logo 
    }); 
    
    +0

    この回答は、私がそれを感謝するので、コードが正しくないにもかかわらず、適切な道を見つけ出すのを助けました。 promiseのpatchValueは私の完璧な必要でした。 – DNorthrup