2016-08-23 5 views
1

Есть ли способ передать информацию с контроллера для обслуживания? Я знаю, что вы должны передавать информацию из службы контроллеру, но позвольте мне объяснить вам мою проблему:AngularJS: информация о проходе от контроллера к службе

У меня есть два экрана (или два вида) с другим контроллером, но с тем же модулем. Назовем их: ControllerOne с ViewOne и ServiceOne AND ControllerTwo с ViewTwo и ServiceTwo.

ServiceOne делает http-запрос, чтобы получить некоторые данные json (из удаленного источника). В ControllerOne У меня есть функция, где он вызывает ServiceOne для получения всех данных, а в ViewOne я показываю список всех видео, полученных из удаленного источника (из ControllerOne).

Код для ServiceOne показано выше:

(function() { 
'use strict'; 

angular 
    .module('MyApp.MyModule') 
    .factory('ServiceOne', ServiceOne); 

ServiceOne.$inject = ['$http', '$q']; 


function ServiceOne($http, $q) { 

    var url = 'https://THE_LINK_I_WANT_TO_GET_DATA_FROM'; 
    var result = []; 

    var service = { 
     getAllVideos: getAllVideos, 
     getVideo: getVideo 
    }; 
    return service; 


    function getAllVideos(callback){ 
     $http.get(url) 
      .success(function(data) { 
       result = data.result; 
       callback(result); 
      }); 
    } 

    function getVideo(videoId) { 
     for (var i = 0; i < result.length; i++) { 
      if (result[i].videoId === videoId) { 
       return $q.when(result[i]); 
      } 
     } 
     return $q.when(null); 
    } 

} 
})(); 

ControllerOne выглядит следующим образом:

(function() { 
    'use strict'; 

    angular 
     .module('MyApp.MyModule') 
     .controller('ControllerOne', ControllerOne); 

     ControllerOne.$inject = ['$scope', '$state', 'ServiceOne']; 

     function ControllerOne($scope, $state, ServiceOne) { 


      var vm = angular.extend(this, { 
       videos: [], 
       navigateToVideo: navigateToVideo 
      }); 


      ServiceOne.getAllVideos(function(data){ 
       vm.videos = data; 
      }); 


      function navigateToVideo(videoId) { 
       $state.go('app.video', { videoId: videoId }); 
      } 


     } 

})(); 

На ViewOne, каждый раз кто-то нажимает на видео, я провожу их в другой точке зрения (ViewTwo в моем случае) и передается параметр (уникальный идентификатор).

ControllerTwo выглядит следующим образом:

(function() { 
'use strict'; 

angular 
    .module('MyApp.MyModule') 
    .controller('ControllerTwo', ControllerTwo); 

    ControllerTwo.$inject = ['$scope', '$state', '$stateParams', 'ServiceOne']; 

    function ControllerTwo($scope, $state, $stateParams, ServiceOne) { 


     var vm = angular.extend(this, { 
      video: [] 
     }); 


     (function init(){ 
      loadData(); 
     })(); 


     function loadData(){  
      var videoId = String($stateParams.videoId); 
      ServiceOne.getVideo(videoId) 
       .then(function(video) { 
        vm.video = video; 
       }); 
     } 


    } 

})(); 

В ControllerTwo откладываю параметр, передаваемый от ControllerOne, и сохранить его на videoId. Затем я вызываю функцию ServiceOne, чтобы получить объект, который я искал.

Итак, мой вопрос:

Могу ли я передать объект vm.video из ControllerTwo в ServiceTwo, так что я могу использовать его в будущем?

Спасибо!

+2

Услуги являются однотоновыми, поэтому пока вы не перезагрузите приложение, вы можете хранить vm.video в сервисе ServiceTwo. Вы также можете использовать localStorage, sessionStorage или кеш $ http ... это зависит от ваших потребностей. – krutkowski86

ответ

0

Услуги предназначены для совместного использования материалов (данных и методов) в вашем приложении. Итак, чтобы ответить на ваш вопрос просто: абсолютно, да, вы можете передать свой объект на службу. И это не может быть проще ...

ServiceOne & ServiceTwo может быть доступна любым контроллером, и если вы хотите, чтобы «передать что-то» на услугу это так просто, как это:

ControllerOne.$inject = ['$scope', '$state', 'ServiceOne', 'ServiceTwo']; 
function ControllerOne($scope, $state, ServiceOne, ServiceTwo) { 

    function loadData(){  
    var videoId = String($stateParams.videoId); 
    ServiceOne.getVideo(videoId) 
    .then(function(video) { 
     vm.video = video; 
     ServiceTwo.video = video; //bam, you're done 
    }); 
    } 
} 

Видео будет сохраняться до перезапуска приложения.

ControllerOne.$inject = ['$scope', '$state', 'ServiceOne', 'ServiceTwo']; 
function ControllerOne($scope, $state, ServiceOne, ServiceTwo) { 
    // now you can access it from your other controller 
    var videoStoredInServiceTwo = ServiceTwo.video; 
} 

Единственное, что нужно знать, это время. Возможно, вы захотите проверить, что видео существует на ServiceTwo, прежде чем пытаться его восстановить.

if(ServiceTwo.video) { 
    videoStoredInServiceTwo = ServiceTwo.video; 
    } 

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

  • Нет связанных вопросов^_^