2014-11-19 20 views
7

Mam wiele kontrolerów dla wielu trasach:jak ponownie wykorzystać funkcję w wielu kontrolerów

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

i dyrektywy, która wykorzystuje $scope.func, w ten sposób:

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

$scope.func jest inna w każdym kontrolerze . Oczekuję, że $ scope.func zarejestruje "trasę 1", gdy będziemy w trasie1, a FirstController jest bieżącym kontrolerem i loguje się "route 2" w trasie 2, ale tylko "rout 1" jest tym, co dostaję w konsoli. czy możesz mi powiedzieć, dlaczego zmiana trasy nie zmienia zakresu dyrektywy?

+0

Może moje rozwiązanie może ci pomóc? http://stackoverflow.com/questions/26921071/initialize-scope-variables-for-multiple-controllers-angularjs/26921599#26921599 – arman1991

Odpowiedz

2

Pojedyncze Zakres było to, że używane do ponownego wykorzystania funkcji, który jest zdefiniowany w inny sposób jest wiele sterowników.
według docs, kiedy izolować zakresu dyrektyw, takich jak:

scope: { 
    myIsolatedFunc: '=' 
} 

kątowa będzie patrzeć obecnego zakresu nieruchomości w nazwie jako wartość myIsolatedFunc własności elementu. co oznacza, że:

jeśli funkcja o nazwie $scope.func1 i element zdefiniowany jako:

<div myIsolatedFunc="func1"> 

aw innym trasie z innego regulatora funkcja jak $scope.func2 wraz z elementem zdefiniowany jako:

<div myIsolatedFunc="func2"> 

można używać obu funkcji w dyrektywie:

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

nie wspominając już o tym, że nie ma potrzeby posiadania różnych nazw dla różnych funkcji.

+0

Przepraszamy za opóźnienie w odpowiedzi. – Reyraa

5

W AngularJS, jeśli funkcja jest używana w kontrolerach.

Najlepsze praktyki to usługa lub fabryka, które zostaną wprowadzone do sterownika.

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

A kiedy mówimy o dyrektywie, zakres dyrektywy będzie z jednym kontrolerem albo kontrolerem dyrektywy lub kontrolerem zewnętrznym, które zdefiniowaliśmy.

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

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

co, jeśli funkcja musi coś zrobić z zakresem? Czy można po prostu przekazać argument "$ scope" jako argument? – leitasat

+0

$ Zasięg jest kosztowny, należy go używać w kontrolerze. jeśli uważasz, że funkcja potrzebuje wartości zakresu, upewnij się, że wysyłasz parametr do usługi jako $ scope.testData. w kanciastej wersji 1.4 i powyżej nie ma już więcej wszystkiego wokół tego obiektu. –