2015-08-31 4 views
0

Ниже элемента в моей mainControllerangularjs служба спутанность

<img src="loader.gif" ng-hide="done_ajax"/> 

и я не могу изменить, используя $ scope.done_ajax, потому что мой Аякса делается в другой контроллер. Как я могу общаться между mainController и моим контроллером2?

app.service('finished_request', function(){ 

}); 

callAPI("getUser", { 
      method: "GET" 
     }).done(function (resp) { 

      $scope.$apply(function() { 

      }); 

}); 
+0

есть смотреть на эту Http: // StackOverflow.com/вопросы/19446755/on-and-broadcast-in-angular –

+0

@ A.T. Я предпочитаю услугу, чем использование $ rootcope. –

+0

попробуйте это. http://stackoverflow.com/questions/11324202/creating-common-controller-functions надеюсь, что это помогает. –

ответ

0

Если вы хотите, чтобы обмениваться данными между двумя контроллерами, вы можете использовать Service. Сервис - это синглтоны, поэтому вы можете легко делиться своими данными.

Однако вы хотите уведомить меня, когда вы изменили свои данные, поэтому для этого вам следует использовать метод $broadcast() и $on().

  • $broadcast: отправляет событие вниз для всех детей прицелов

Поскольку нет никакой родитель-ребенок связи между вашими областями, если ваши контроллеры находятся на тот же уровень, вы можете вводить $rootScope в контроллер и транслировать событие на все дочерние области.

РЕДАКТИРОВАТЬ

есть пример с помощью службы и трансляцию параметра.

Так что вы можете сделать:

Контроллер

(function(){ 

function Controller($scope, $rootScope, Service) { 

    $scope.data = 1; 

    $scope.set = function(n){ 
    $scope.data = n; 
    Service.set($scope.data); 
    $rootScope.$broadcast('set', $scope.data); 
    } 

} 

angular 
.module('app', []) 
.controller('ctrl', Controller); 

})(); 




(function(){ 

function Controller($scope, Service) { 

    $scope.$on('set', function(e, data){ 
    $scope.data2 = Service.get(); 
    $scope.data3 = data; 
    }); 

} 

angular 
.module('app') 
.controller('ctrl2', Controller); 

})(); 

Услуги

(function(){ 

    function Service(){ 

    var data; 

    function get(){ 
     return data; 
    } 

    function set(value){ 
     data = value; 
    } 


    return { 
     get: get, 
     set: set 
    }; 

    } 

    angular 
    .module('app') 
    .factory('Service', Service); 

})(); 

HTML

<body ng-app='app'> 

    <h3>Controller 1</h3> 
    <div ng-controller="ctrl"> 
     <button ng-click="set(data)">change</button> 
     <input type="text" ng-model="data"> 
    </div> 

    <h3>Controller 2</h3> 
    <div ng-controller="ctrl2"> 
     <p>Data from controller 1 : {{data2}}</p> 
     <p>Data from controller 1 without service : {{data3}}</p> 
    </div> 

    </body> 

Теперь вы сможете общаться между контроллерами разных типов и извлекать данные с помощью Сервиса.

Вы можете увидеть Plunker

Просто с помощью Service одноплодной

Контроллер

(function(){ 

function Controller($scope, Service) { 

    $scope.data = 1; 

    $scope.set = function(n){ 
    Service.set(n) 
    } 

} 

angular 
.module('app', []) 
.controller('ctrl', Controller); 

})(); 



(function(){ 

function Controller($scope, Service) { 
    //Retrieve service instance 
    $scope.data_service = Service; 

} 

angular 
.module('app') 
.controller('ctrl2', Controller); 

})(); 

HTML

<body ng-app='app'> 

    <h3>Controller 1</h3> 
    <div ng-controller="ctrl"> 
     <button ng-click="set(data)">change</button> 
     <input type="text" ng-model="data"> 
    </div> 

    <h3>Controller 2</h3> 
    <div ng-controller="ctrl2"> 
     <p>Data from controller 1 : {{data_service.get()}}</p> 
    </div> 

    </body> 

Здесь мы просто передаем экземпляр нашего Сервиса.

Вы можете увидеть Plunker with Service

+0

также можно использовать трансляцию без обслуживания. Верный? –

+0

Да, вы можете передавать данные в качестве второго параметра метода '$ broadcast'. –

+0

Может ли это сделать без $ broadcast? посмотрите мой поток здесь http://stackoverflow.com/questions/32312018/angularjs-service-doesnt-work-in-my-case –

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