2017-02-02 1 views
1

Ich habe eine dynamisch durch den Benutzer erzeugten Form:NG2-dragula und dynamische Form kein Sync direkt

// this._fb is a FormBuilder 
    ngOnInit():void { 
    this.myForm = this._fb.group({ 
     message: this._fb.array([ 
     ]) 
    }); 

die json erzeugt sind so etwas wie

{ 
    "message": [ 
    { 
     "type": 1, 
     "value": "first message", 
    }, 
    { 
     "type": 1, 
     "value": "second message", 
    } 
    ] 
} 

Ich habe die NG2-dragula Richtlinie hinzugefügt bestellen, um die Nachrichten zu ändern

<form [formGroup]="myForm"> 
    <div formArrayName="message"> 
    <div [dragula]='"bag-one"' [dragulaModel]='myForm.controls.message.controls'> 
     <div *ngFor="let c of myForm.controls.message.controls; let i=index" class="panel panel-default" > 
     <div class="panel-body" [formGroupName]="i"> 
      <label>value</label> 
      <input type="text" class="form-control" formControlName="value"> 
     </div> 
     </div> 
    </div> 
    </div> 

Die Drag-Funktion jedoch gut funktioniert, wenn ich d Wenn ich den JSON meiner Form spiele, ist es immer noch die alte Reihenfolge, außer wenn ich anfange, den Inhalt eines Feldes zu ändern. In diesem Fall wird das Formular aktualisiert.

+0

nur eine kurze Vermutung: '[dragulaModel] MyForm.Controls '=. message.controls' ist ein Weg, der bindet. Kannst du die bidirektionale Bindung hier oder ein Ereignis verwenden, um dein Modell zu aktualisieren? – Riscie

+0

Ich bin ziemlich neu zu angular2 was meinst du mit Zwei-Wege-Bindung verwenden '[(ngModel)]'? Was ist seltsam ist, dass, wenn ich anfange, ein Feld zu bearbeiten, ändert sich alles in die richtige Reihenfolge – Alexis

Antwort

1

Also habe ich eine Lösung gefunden, nicht sicher, es ist das beste und ich bin ziemlich neu zu kantig, aber zumindest funktioniert es.

Also ich finde heraus, dass ich einen Weg finden muss, ein Ereignis aus dem Formular zu emittieren.

In meiner Form habe ich tatsächlich ein Wert "Ordnung" in der Liste der ID entspricht, so das folgende ich getan habe:

_dragulaService.dropModel.subscribe((value:any) => { 
     console.log(value); 
     this.onDropModel(value.slice(1)); 
    }); 
    } 

    private onDropModel(args:any):void { 
    for (let i = 0; i < (<FormArray>this.myForm.get('message')).length; ++i) { 
     (<FormArray>this.myForm.get('message')).at(i).patchValue("order", i); 
    } 
    }