myAppServices.factory('ProfileData',['$http', function($http){
return{
newly_joined:function(callback){
$http.get(
//myUrl will be an url from controller.
myUrl
).success(callback);
}
};
}
]);
我有三个控制器,它们有不同的URL:
控制器1:
AppControllers.controller('ProfileListCtrl',['$scope','$state', '$rootScope', 'ProfileData', '$timeout', function($scope, $state, $rootScope, ProfileData, $timeout ) {
ProfileData.newly_joined(function(response) {
var myUrl= "www.abc...."
//something goes there
});
}]);
控制器2:
AppControllers.controller('ProfileListCtrl1',['$scope','$state', '$rootScope', 'ProfileData', '$timeout', function($scope, $state, $rootScope, ProfileData, $timeout ) {
ProfileData.newly_joined(function(response) {
var myUrl= "www.abc...."
//something goes there
});
}]);
和控制器3是:
AppControllers.controller('ProfileListCtrl2',['$scope','$state', '$rootScope', 'ProfileData', '$timeout', function($scope, $state, $rootScope, ProfileData, $timeout ) {
ProfileData.newly_joined(function(response) {
var myUrl= "www.abc...."
//something goes there
});
}]);
由于URL不同,我想在不同的控制器中使用不同的数据,我在单个网页上显示所有三个细节。
因此,如果有任何方法可以在工厂发送' myUrl' ,我可以使用它来提取数据。
注意:请不要建议我使用$ resource或$ routeparams,因为$ resource在从json中提取数据时没有成功,我也不想在页面中使用大变量Url。
提前致谢
答案 0 :(得分:0)
您需要做的就是为new_joined函数添加一个额外的参数:
newly_joined:function(callback, myUrl){
此外,您应该使用.then而不是.success
答案 1 :(得分:0)
您的工厂应该返回承诺而不是使用回调。
myAppServices.factory('ProfileData',['$http', function($http){
return function(myUrl) {
return $http.get(myUrl);
};
}]);
控制器
AppControllers.controller('ProfileListCtrl',['$scope', 'ProfileData', function($scope,ProfileData) {
var myUrl= "www.abc....";
var httpPromise = ProfileData(myUrl);
httpPromise.then(function onFulfilled(response) {
$scope.data = response.data;
}).catch(function onRejected(response) {
console.log("ERROR ", response.status);
});
}]);
使用promises的优点是它们保留了错误信息。
另请注意,myUrl
作为参数发送到工厂。
有关使用promises的优势的更多信息,请参阅Why are Callbacks from Promise Then Methods an Anti-Pattern?