2017-09-24 5 views
0

Ich fange gerade an, mit Komponenten in Angular 1.5.x zu spielen und habe eine für eine Auswahlbox auf einem Formular erstellt - ich übergebe das Feld, Liste und Etikett auf die Komponente und es erstellt die Form "Teil" bestehend aus der Bezeichnung und Auswahlbox mit den richtigen Optionen - so weit, so gut.Angular 1.5 ng-change auf Element in Komponente triggern vorherige Antwort

Jetzt möchte ich eine ng-Änderung auf der Auswahl implementieren, so dass ich die Funktion übergeben möchte, die ich dafür verwenden möchte. Das Problem, das ich habe, ist, dass die Funktion mit dem alten Wert für die Auswahl nicht den neuen Wert auslöst. Ich kann sehen, dass die Funktion vor der eigentlichen Änderung auslöst. Wenn ich die Change-Funktion in das Component-Change-Event setze, registriert sie sich korrekt, aber nicht mit einer übergebenen Funktion.

Ich habe eine abgespeckte Geige erstellt bei https://jsfiddle.net/7gd3m2k0/

<div ng-app="demoApp"> 
    <div ng-controller="RoleController as ctrl"> 
    <nac-select  
     field="ctrl.MemberRole.record.member" 
     list="ctrl.Lists.Member" 
     label="Member" 
     on-change="ctrl.MemberRole.changeMember();"></nac-select> 
    <div ng-bind="ctrl.MemberRole.record.member.name"></div> 
    </div> 
</div> 

angular.module('demoApp', []) 
.component('nacSelect', nacSelect) 
.controller('RoleController', roleController) 

var nacSelect = { 
bindings: { 
      field: '=', 
      list: '<', 
      label: '@label', 
      onChange: '&' 
     }, 
     controller: function() { 
      var ctrl = this; 
      ctrl.change = function() {      
       alert(ctrl.field.name); //gives new selection 
       ctrl.onChange(); //gives previous selection 
      } 
     }, 
    template: ` 

    <label>{{$ctrl.label}}</label> 
    <select ng-model="$ctrl.field" ng-options="r as r.name for r in $ctrl.list" ng-change="$ctrl.change();"> 
     <option value="">(Please Select)</option> 
    </select> 
` 
}; 

var roleController = function(){ 
var ctrl = this; 

    ctrl.Lists = { 
Member: [ 
    {id: 1, name: 'Fred Smith'}, 
    {id: 2, name: 'Jenny Jones'}, 
    {id: 3, name: 'Jane Doe'} 
] 
    }; 

ctrl.MemberRole = { 
record: { 
    member: null 
}, 
    changeMember: function(){ 
    alert(ctrl.MemberRole.record.member.name);  
    } 
    }; 
}; 

Ich glaube, ich etwas Einfaches bin fehlt, aber ich kann es nicht herausgefunden. Vielen Dank für Ihre Unterstützung

Antwort

0

Sie müssen in Variablen zu übergeben, die Sie in den ersten Controller alarmieren wollen, überprüfen Sie diese:

https://jsfiddle.net/pegla/7gd3m2k0/1/

so Ihre Funktion würde wie folgt aussehen:

changeMember: function(name){ 
     alert(name); 
    } 

wenn Sie verwenden nac-wählen

<nac-select field="ctrl.MemberRole.record.member" list="ctrl.Lists.Member" label="Member" on-change="ctrl.MemberRole.changeMember(name);"></nac-select> 

und am Ende in der nac-select:

<select ng-model="$ctrl.field" ng-options="r as r.name for r in $ctrl.list | orderBy: 'name'" ng-required="$ctrl.req" ng-if="!$ctrl.list.processing" ng-change="$ctrl.onChange($ctrl.field)"> 

oder wenn Sie in Objekt zu übergeben wollen:

changeMember: function(obj){ 
     alert(`${obj.name} ${obj.id}`); 
    } 

Neu:

<nac-select field="ctrl.MemberRole.record.member" list="ctrl.Lists.Member" label="Member" on-change="ctrl.MemberRole.changeMember({id, name});"></nac-select> 

dann changeMember wie folgt aussehen Geige: https://jsfiddle.net/pegla/7gd3m2k0/2/

+0

danke, aber was, wenn ich das ganze Objekt weitergeben möchte? Es gibt zwei Objekte - ein Mitglied und eine Rolle. Die Funktion des Hauptcontrollers ist im Wesentlichen: Wenn (Mitglied ist Objekt und Rolle ist Objekt) dann teste einige Kontrollen - deshalb habe ich versucht, den Wert des Modells in dieser Funktion zu verwenden. –

+0

Es ist das gleiche, um das Objekt zu übergeben, überprüfe die aktualisierte Antwort, auch muss ich sagen, dass, obwohl dies funktionieren würde, würde ich deinen Ansatz überdenken, wenn du mit komponentenbasierter Architektur anfängst, solltest du keine 2-Wege-Bindungen und Relaying auf Elternkomponenten verwenden als ganzer Zweck ist es, Komponenten zu isolieren, um sie klein und wiederverwendbar zu machen. Ich würde empfehlen, dieses, wirklich beste Tutorial über komponentenbasierte Architektur online zu lesen: https://github.com/toddmotto/angularjs-styleguide – pegla

+0

vielen Dank - ich habe gerade die sendende Objekt-Sache als Ergebnis von https://stackoverflow.com/questions/18378520/angularjs-pass-function-to-directive. Ich werde Ihren Vorschlag lesen, weil ich dachte, dass ich die Komponente klein und wiederverwendbar machen würde, indem ich die Funktion übergebe, die ich wollte, wenn sich die Auswahl ändert :). –

Verwandte Themen