2014-11-19 18 views
7

ho più controller per percorsi multipli:come riutilizzare una funzione in più controller

app.controller('FirstController', function ($scope) { 
    $scope.func = function() { 
    console.log('route 1'); 
    } 
} 
app.controller('SecondController', function ($scope) { 
    $scope.func = function() { 
    console.log('route 2'); 
    } 
} 
... 

e una direttiva che utilizza il $scope.func, in questo modo:

app.directive('thedirective', function() { 
    return { 
    link: function (scope, $element, attrs) { 
     $scope.func(attrs.thedirective); 
    } 
    } 
}); 

$scope.func è differente in ciascun controllore . Mi aspetto che $ scope.func registri "route 1" quando ci troviamo in route1 e FirstController è il controller corrente e per registrare "route 2" quando ci si trova nella route 2, ma solo "rout 1" è ciò che ottengo in console. potrebbe dirmi perché cambiare rotta non cambia $ scope of directive?

+0

Forse la mia soluzione può aiutarti? http://stackoverflow.com/questions/26921071/initialize-scope-variables-for-multiple-controllers-angularjs/26921599#26921599 – arman1991

risposta

2

Isolato Scope era quello che ho usato per il riutilizzo di una funzione che è definita in modo diverso è più controllori.
secondo i documenti, quando si isolare il campo di applicazione delle direttive come:

scope: { 
    myIsolatedFunc: '=' 
} 

angolare cercherà l'ambito corrente per una proprietà denominata come valore della proprietà di myIsolatedFunc elemento. il che significa che:

se si dispone di una funzione denominata $scope.func1 e un elemento definito come:

<div myIsolatedFunc="func1"> 

e in un altro percorso con un altro controllore una funzione come $scope.func2 insieme a un elemento definito come:

<div myIsolatedFunc="func2"> 

è possibile utilizzare entrambe le funzioni in una direttiva:

app.directive('thedirective', function() { 
    return { 
    scope: { 
     myIsolatedFunc: '=' 
    }, 
    link: function (scope, $element, attrs) { 
     $scope.myIsolatedFunc(attrs.thedirective); 
    } 
    } 
}); 

per non parlare non è necessario avere nomi diversi per funzioni diverse.

+0

Ci scusiamo per il ritardo nella risposta. – Reyraa

5

In AngularJS se la funzione viene utilizzata comunemente nei controller.

Le migliori pratiche sono utilizzare il servizio o la fabbrica che si iniettano al controller.

app.factory('commonService', function ($scope) { 
    var obj= {}; 
     obj.func = function() { 
     console.log('route 1'); 
     } 
    obj.func1 = function() { 
     console.log('route 2'); 
     } 
    return obj; 
    } 
    app.controller('FirstController', function ($scope,commonService) { 
     console.log('route 1' + commonService.func()); 
    } 
    app.controller('SecondController', function ($scope,commonService) { 
     console.log('route 2' + commonService.func1()); 
    } 

E quando si parla di direttiva, di applicazione della direttiva sarà con un controller o controller di direttiva o il controller esterno che abbiamo definito.

<div ng-controller="firstController"> 
<your-directive /> 
</div> 

<div ng-controller="secondController"> 
<your-directive /> 
</div> 
+0

Cosa succede se la funzione deve fare qualcosa con l'oscilloscopio? Va bene solo passare '$ scope' come argomento? – leitasat

+0

$ scope è costoso dovrebbe essere utilizzato nel controller. se pensate che la funzione abbia bisogno di un valore di scope, assicuratevi di inviare parametri al servizio come $ scope.testData. nell'angolare 1.4 e sopra non c'è più spazio per tutto questo oggetto. –

Problemi correlati