2014-07-01 16 views
6

Sono piuttosto nuovo rispetto alle direttive Angular e sto avendo un sacco di problemi nel far questo per fare ciò che voglio. Ecco le basi di quello che ho:Direttiva AngularJs: metodo call dall'ambito padre all'interno del modello

Controller:

controller('profileCtrl', function($scope) { 
    $scope.editing = { 
    'section1': false, 
    'section2': false 
    } 
    $scope.updateProfile = function() {}; 
    $scope.cancelProfile = function() {}; 
}); 

direttiva:

directive('editButton', function() { 
    return { 
    restrict: 'E', 
    templateUrl: 'editbutton.tpl.html', 
    scope: { 
     editModel: '=ngEdit' 
    } 
    }; 
}); 

Template (editbutton.tpl.html):

<button 
    ng-show="!editModel" 
    ng-click="editModel=true"></button> 
<button 
    ng-show="editModel" 
    ng-click="updateProfile(); editModel=false"></button> 
<button 
    ng-show="editModel" 
    ng-click="cancelProfile(); editModel=false"></button> 

HTML:

<edit-button ng-edit="editing.section1"></edit-button> 

Se non è chiaro, voglio che il tag <edit-button> contenga tre pulsanti diversi, ognuno dei quali interagisce con qualsiasi proprietà di ambito passata in ng-edit. Quando si fa clic, devono cambiare la proprietà, quindi chiamare il metodo di ambito appropriato.

Il modo in cui è ora, cliccando sui pulsanti cambia correttamente i valori di $scope.editing, ma la updateProfile e cancelProfile metodi non funzionano. Potrei non essere d'accordo su come utilizzare correttamente le direttive, ma ho difficoltà a trovare un esempio online per aiutarmi a realizzare ciò che sto cercando di fare. Qualsiasi aiuto sarebbe apprezzato.

risposta

15

Un modo sarebbe chiamare le funzioni utilizzando $parent.

<button ng-show="editModel" ng-click="$parent.cancelProfile(); editModel=false">b3</button> 

Demo

Un altro modo (e probabilmente il modo migliore), è quello di configurare isolato campo di applicazione del vostro direttiva per contenere riferimenti a quelle funzioni del controller:

app.directive('editButton', function() { 
    return { 
    restrict: 'E', 
    templateUrl: 'editbutton.tpl.html', 
    scope: { 
     editModel: '=ngEdit', 
     updateProfile: '&', 
     cancelProfile: '&' 
    } 
    }; 
}); 

Poi si passa le funzioni tramite HTML:

<edit-button ng-edit="editing.section1" update-profile='updateProfile()' cancel-profile='cancelProfile()'></edit-button> 

Demo

+0

Grande, grazie. Sono propenso a usare il tuo primo esempio, poiché i due metodi saranno sempre gli stessi in tutte le direttive e ridurranno l'html estraneo. Cosa ti fa dire che il secondo modo è il "modo migliore?" –

+1

@futurityverb, il secondo metodo è più generale. Se vuoi un'istanza della direttiva con un comportamento leggermente diverso, puoi semplicemente passare un metodo diverso che dovrebbe essere chiamato. Inoltre, se si inizia a nidificare la direttiva all'interno di altre direttive, '$ parent' potrebbe non fare più riferimento all'ambito del controller, ma a qualche altro ambito intermedio. – Jerrad

+1

Mi ha spinto nella giusta direzione, ma cosa succede se voglio passare argomenti ai metodi usando il tuo secondo esempio? –

Problemi correlati