2014-11-19 5 views
7

Ich habe mehrere Controller für mehrere Routen:wie eine Funktion in mehreren Controllern wiederzuverwenden

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

und eine Richtlinie, die die $scope.func verwendet, auf diese Weise:

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

$scope.func unterschiedlich ist in jedem Controller . Ich erwarte, dass $ scope.func "route 1" protokolliert, wenn wir in route1 sind und FirstController der aktuelle Controller ist und "route 2" in Route 2 protokolliert, aber nur "router 1" ist, was ich in der Konsole bekomme. Kannst du mir bitte sagen, warum die Änderung der Route den Geltungsbereich der Richtlinie nicht ändert?

+0

Vielleicht kann meine Lösung Ihnen helfen? http://stackoverflow.com/questions/26921071/initialize-scope-variables-for-multiple-controllers-angularjs/26921599#26921599 – arman1991

Antwort

2

Isoliert Scope war, was ich für die Wiederverwendung einer Funktion verwendet, die unterschiedlich definiert ist, mehrere Controller.
nach docs, wenn Sie isolieren den Anwendungsbereich der Richtlinien wie:

scope: { 
    myIsolatedFunc: '=' 
} 

Angular den aktuellen Rahmen für eine Eigenschaft als Wert myIsolatedFunc Eigenschaft Element mit dem Namen nachzuschlagen. was bedeutet, dass:

<div myIsolatedFunc="func1"> 

und in einer anderen Route mit einem anderen Controller eine Funktion wie $scope.func2 zusammen mit einem Elemente definiert als:

, wenn Sie eine Funktion $scope.func1 und ein Element definiert als Namen haben

<div myIsolatedFunc="func2"> 

können Sie beide Funktionen in einer Direktive verwenden:

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

nicht zu erwähnen, es gibt keine Notwendigkeit, unterschiedliche Namen für verschiedene Funktionen zu haben.

+0

Entschuldigung für die Verzögerung bei der Beantwortung. – Reyraa

5

In AngularJS, wenn die Funktion häufig in Controllern verwendet wird.

Best Practices ist Service oder Fabrik verwenden, die Controller injizieren wird.

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()); 
    } 

Und wenn wir über Richtlinie Anwendungsbereich der Richtlinie wird mit einem Controller entweder Richtlinie Controller oder außerhalb Controller sprechen, die wir definiert.

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

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

Was ist, wenn die Funktion etwas mit dem Umfang tun muss? Ist es in Ordnung, den '$ scope' einfach als Argument zu übergeben? – leitasat

+0

$ Scope ist teuer es sollte in Controller verwendet werden. Wenn Sie der Meinung sind, dass die Funktion einen Wert für den Gültigkeitsbereich benötigt, stellen Sie sicher, dass Sie den Parameter als $ scope.testData an den Service senden. in eckigen 1.4 und darüber nicht mehr alles, was dieses Objekt. –

Verwandte Themen