2014-09-16 4 views
1

У меня есть директива, в которой определен контроллер, и есть переменная say «$scope.accesJson». Мне нужно получить доступ к нему с другого контроллера.Angularjs: получить значение переменной области видимости в контроллере, определенном внутри другого контроллера, который находится внутри директивы

Код:

angular.module('test.directives').directive("manageAccess", function() { 
    return { 
     restrict: "E", 
     replace: true, 
     templateUrl: "template/test.html", 
     controller: function($scope, $element, $http) { 
      $scope.accesJson = ["hi","hello"]; 
     } 
    }; 
}); 

У меня есть еще один контроллер,

angular.module("test.controllers").controller("testController", function($scope, $http) { 
    $scope.getUsers = function() { 
     console.log $scope.accesJson //I need value of $scope.accesJson here. 
    } 
}); 

Как я могу это сделать?

Пожалуйста, помогите, Спасибо

ответ

2

Для обмена данных между различным контроллером Service является хорошим вариантом. Определите один, как так,

angular.module("test.services").factory('DataBasket', function() { 
    return {}; 
}); 

И в директиве

controller: function($scope, $element, $http, DataBasket) { 
     DataBasket.accessJson = ["hi", "hello"]; 
     $scope.accesJson = DataBasket.accessJson; 
    } 

от другого контроллера

angular.module("test.controllers").controller("testController", function($scope, $http, DataBasket) { 
    $scope.getUsers = function() { 
     console.log DataBasket.accesJson 
    } 
}); 
3

Для совместного использования ресурсов между двумя контроллерами, вы всегда можете использовать услугу или завод. Вы также можете сделать это, указав глобальную переменную, но это НЕ поощряется.

Чтобы объявить завод:

var app = angular.module('app',[]) 
.factory('appSvc',[function(){ 
    var resources = {}; 
    return resources; 
}]); 

к сведению, что вы можете объявить многоразовые функции внутри завода.

С заявлением о своей фабрике не забудьте ввести его правильно в свои контроллеры, которым это необходимо.

app.controller('appCtrl',['appSvc',function(appSvc){ 
//do something with your appSvc 
}]); 

Вот очень simple plnkr, чтобы показать, как сервис/завод используется для получения и установки данных.

Для документации углубленному: AngularJs Service

1

Вы также можете связать свойство от внешнего $ рамки для директивы в связывании функции директивы, например:

angular.module('foo', []) 

.directive("manageAccess", 
    function() { 
    return { 
     restrict: "E", 
     replace: true, 
     scope: { 
     property: '=' 
     }, 
     link: function($scope) { 
     $scope.property = { foo: 1 } 
     } 
    } 
    } 
) 

.controller('Main', 
    function($scope) { 
    $scope.showAccessJsonValue = function() { 
     $scope.value = $scope.accessJson 
    } 
    } 
) 

Тогда в вашем шаблоне может быть ng-click, который вызывает showAccessJsonValue, который даст вам значение, которое вы указали в директиве.

Мол,

<body ng-controller="Main"> 

<manage-access property="accessJson"></manage-access> 

<button ng-click="showAccessJsonValue()">Show value</button> 

<pre>{{value | json}}</pre> 

</body> 

Вот demo Plunk.

Смежные вопросы