2014-11-19 13 views
7

Birden rotalar için birden denetleyicileri var:nasıl birden kontrolörleri bir işlev yeniden

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

ve $scope.func kullanan bir yönerge, bu şekilde:

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

$scope.func her denetleyici farklıdır . Ben route1 ve FirstController geçerli denetleyici olduğunda ve route 2'de "route 2" günlüğüne kayıt yapmak için $ scope.func "route 1" günlüğüne giriş beklerim, ancak konsolda aldığım "rout 1" dir. lütfen rotayı değiştirmenin neden do scopegrudaki do scopegruyu de doesn'tgistirmediğini söyler misiniz? İşlevler denetimlerde yaygın olarak kullanılıyorsa AngularJS'de

+0

Belki de çözümüm size yardımcı olabilir? http://stackoverflow.com/questions/26921071/initialize-scope-variables-for-multiple-controllers-angularjs/26921599#26921599 – arman1991

cevap

2

İzole kapsamı ben farklı tanımlanmış çok sayıda kontrol olduğu bir işlevi yeniden kullanmak için kullanılır ne. docs göre
, sizin gibi yönergelerin kapsamını yalıtmak zaman:

scope: { 
    myIsolatedFunc: '=' 
} 

Açısal elemanın myIsolatedFunc özelliğinin değeri olarak adlandırılan bir özellik için geçerli kapsamını kadar bakacağız.

: Bir öğenin birlikte $scope.func2 gibi bir işlev olarak tanımlanan başka denetleyici ile

<div myIsolatedFunc="func1"> 

ve başka rota yılında:

bir işlev $scope.func1 adlı sen varsa ve bir eleman olarak tanımlanır: yani

<div myIsolatedFunc="func2"> 

bir yönergede işlevlerin her ikisini kullanabilirsiniz:

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

, farklı işlevler için farklı isimlere sahip olmanıza gerek olmadığı belirtilmelidir.

+0

Cevaplamadaki gecikme için özür dilerim. – Reyraa

5

.

En iyi uygulamalar, denetleyiciye enjekte edilecek servis veya fabrikadır.

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

Ve direktif bahsederken, direktifin kapsamı biri kontrolörü yönergesi denetleyici ya da biz tanımlanmış dış denetleyici biriyle olacaktır.

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

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

İşlev, kapsamla ilgili bir şeyler yapmak isterse ne olur? Sadece $ kapsamını argüman olarak iletmek yeterli midir? – leitasat

+0

$ kapsamı pahalı olmakla birlikte kontrolörde kullanılmalıdır. İşlevin kapsam değerine ihtiyacı olduğunu düşünüyorsanız, parametreyi hizmete $ scope.testData olarak gönderdiğinizden emin olun. 1.4 ve üstü açılarda bu nesnenin daha fazla kapsamı yoktur. –

İlgili konular