2016-05-16 4 views
2

Я застрял, может кто-нибудь мне помочь. Вот коды. Я пишу grabData сервис для получения данных с URL-адреса. Тогда в контроллере firstcontroller Я фильтрация данных в соответствии с поиска коробки: Это код:Доступ к данным от одного контроллера к другому

.factory("grabData",['$http',function($http){ 
    return{ 
     showData:function(){ 
      return $http.get("/http://localhost:5555/sampleData.json"); 
     } 
    } 
}]) 
.controller('firstController',function($scope, $filter,grabData) { 
     grabData.showData().success(function(data){ 
     $scope.items = data; 
     $scope.items1 = $scope.items; 

     $scope.$watch('search', function(val){ 
       $scope.items = $filter('filter')($scope.items1, val); 
     }); 
} 

И HTML код: <div ng-controller="firstController"> <input type="text" ng-model="search"> </div>

Может ли один помочь мне в отображении $ scope.items в следующих контроллеров:

.controller('secondcontroller',function($scope){ 
    // Here I want to use $scope.items , from first controller 
}) 
.controller('thirdcontroller',function($scope){ 
    // Here I want to use $scope.items , from first controller 
}) 
.controller('fourthcontroller',function($scope){ 
    // Here I want to use $scope.items , from first controller 
}) 

Может ли один пожалуйста, помогите решить эту пробл Эм.

+1

Кэш данных в службе и ссылку на нее, если она уже существует. При необходимости обновить. [Что-то вроде этого] (http://stackoverflow.com/questions/19648345/angularjs-factory-only-called-once). Затем при необходимости добавьте службу в свои контроллеры. – mariocatch

ответ

3

Написать свой сервис, как это,

.service("grabData",['$http', '$q', function($http, $q){ 

    var sampleData = null; 
    var filteredData = null; 

    this.showData = function() { 
     var deferred = $q.defer(); 

     if(sampleData!=null){ 
      //if data has already been fetched from server before, serve it 
      deferred.resolve(sampleData) 
     } 
     else { 
      //else, fetch the data from server, and store it for future use 
      $http.get("/http://localhost:5555/sampleData.json").then(function(res){ 
       sampleData = res.data; 
       deferred.resolve(sampleData); 
      }) 
     } 
     return deferred.promise; 
    }; 

    //call this from controller1, inside your watch 
    this.setFilteredData = function(data){ 
     filteredData = data; 
    }; 

    //call this from other 2 controllers 
    this.getFilteredData = function(){ 
     return filteredData; 
    }; 


    }]) 

, а затем изменить свои контроллеры, как это,

.controller('secondcontroller',function($scope, grabData){ 
    // do whatever you want to do with grabData 
    //use that "grabData.showData().success" pattern as it is still a promise 
}) 
.controller('thirdcontroller',function($scope, grabData){ 
    // do whatever you want to do with grabData 
    // call grabData.getFilteredData() from here 
}) 
.controller('fourthcontroller',function($scope, grabData){ 
    // do whatever you want to do with grabData 
    // call grabData.getFilteredData() from here 
}) 

Надеется, что это помогает. Если у вас есть сомнения, пожалуйста, спросите в комментариях.

+0

Спасибо, ответ. Я делаю фильтрацию, в ** firstcontroller **. Я хочу использовать эти отфильтрованные данные из ** firstcontroller ** в моих контроллерах remainging. – naik3

+0

Могу ли я написать код фильтрации только в службе grabData. Если это так, то как я могу отфильтровать входные данные из HTML и передать его в ** grabData ** для фильтрации. – naik3

+0

В службе 'grabData', напишите 2 функции,' setFilteredData (data) 'и' getFilteredData() '. вызовите 'setFilteredData' из 1-го контроллера и' getFilteredData' из другого 2. Это выполнит задание. Поскольку все происходит внутри Углового мира, любое изменение в одной части автоматически инициирует изменение во всей другой части. –

-1

Вам нужно впрыскивать завод:

.controller('firstController', ['grabData', function($scope, $filter,grabData) { 
    // Your code here 
}]); 

То же самое идет для других контроллеров.

+0

Что делать, если showData() - дорогостоящий вызов сервера? Вы собираетесь называть его несколько раз, для каждого контроллера? – user1620220

+0

Ну, если это так, для него может быть более разумным использовать ui-router, поставить вызов в разрешении в родительском состоянии, а затем позволить дочерним состояниям иметь контроллеры. Затем каждый может получить доступ к решению родителя, которое содержит один вызов showData(). – rrd

+0

Если такой же код используется во всех средствах управления, мне нужно написать HTML-код для соответствующих HTML-тегов div. ???? – naik3

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