从控制器发送数据到工厂?

时间:2016-03-21 13:12:52

标签: javascript angularjs angularjs-directive angular-ui-router angular-services

我的工厂是:

 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。

提前致谢

2 个答案:

答案 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);
    });

}]);

DEMO on JSFiddle

使用promises的优点是它们保留了错误信息。

另请注意,myUrl作为参数发送到工厂。

有关使用promises的优势的更多信息,请参阅Why are Callbacks from Promise Then Methods an Anti-Pattern?