AngularJS:将信息从Controller传递给服务

时间:2016-08-23 14:02:40

标签: angularjs angular-services angular-controller

有没有办法将信息从控制器传递到服务?我知道您应该将信息从服务传递给控制器​​,但让我向您解释一下我的问题:

我有两个屏幕(或两个视图),具有不同的控制器但具有相同的模块。让我们为它们命名: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)并传递参数(唯一ID)。

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的{​​{1}}对象传递给ControllerTwo,以便将来可以使用它?

谢谢!

1 个答案:

答案 0 :(得分:0)

服务是MADE,用于在您的应用程序中共享内容(数据和方法)。所以,简单地回答你的问题:绝对,是的,你可以将你的对象传递给你的服务。并且,它不会更容易......

ServiceOne&amp;任何控制器都可以访问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;
  }