有没有办法将信息从控制器传递到服务?我知道您应该将信息从服务传递给控制器,但让我向您解释一下我的问题:
我有两个屏幕(或两个视图),具有不同的控制器但具有相同的模块。让我们为它们命名: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
,以便将来可以使用它?
谢谢!
答案 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;
}