AngularJS:从工厂向控制器注入数据

时间:2015-03-13 15:27:03

标签: javascript angularjs angularjs-controller angularjs-factory

我试图获取一些数据,然后将其传递给控制器​​进行进一步处理。我已经设置了一个工厂来获取数据但是有问题将它传递给控制器​​并使其正常工作。以下是我正在使用的案例。

 var app = angular.module("contactApp",[]);

    app.factory('listData',function($http){
     return{
        getData: function(onSuccess,onFailure,itemID){
            $http.get("/_api/web/lists/getbytitle('Consultant%20Profile')/items?$filter=ID%20eq%20"+itemID).success(onSuccess).error(onFailure);

        }

      };
    });

   app.controller('ContactController', function(listData,$scope){

        //setTimeout(function(){console.log(Data)},2000);

        console.log("Controller called. Hello");

        listData.getData(successFunction,failFunction,curItemId);

        successFunction = function(data){
            $scope.resData = data;
            console.log("Success - ", data);
        }

        failFunction - function(data){
            console.log("Didn't work - ", data);
        }

    });

这给我以下错误。

  

未定义successFunction

不确定我做错了什么,非常感谢任何输入!

修改

向下移动功能的效果非常好,但异步调用失败了。我切换到使用$ ajax并且它工作正常,但$ http因某些原因无效!

 app.factory('listData',function($http){
    return{
        getData: function(onSuccess,onFailure,itemID){
            //$http.get("/_api/web/lists/getbytitle('Consultant%20Profile')/items?$filter=ID%20eq%20156").success(onSuccess).error(onFailure);
            $.ajax({
                url:"/_api/web/lists/getbytitle('Consultant%20Profile')/items?$filter=ID%20eq%20"+itemID,
                headers: {"accept": "application/json; odata=verbose"},
                success: onSuccess,
                error: onFailure
            });

        }

    };
});

这些数据来自SharePoint列表,但这无关紧要。我会继续挖掘,如果我发现任何我找不到的语法错误,请告诉我。

我非常感谢帮助人员!

编辑2:

好的,这个问题是无关紧要的。我发现了问题,SharePoint使用odata所以我必须传递标题:

    app.factory('listData',function($http){
    return{
        getData: function(onSuccess,onFailure,itemID){
            $http(
                {
                    method: "GET",
                    headers: {"accept": "application/json; odata=verbose"},
                    url: "/_api/web/lists/getbytitle('Consultant%20Profile')/items?$filter=ID%20eq%20"+itemID
                }
            ).success(onSuccess).error(onFailure);

        }

    };
});

你们摇滚!!!!!!!

1 个答案:

答案 0 :(得分:0)

正如Daniel A. White所说,在你打电话之前宣布你的功能。

var app = angular.module("contactApp",[]);

    app.factory('listData',function($http){
     return{
        getData: function(onSuccess,onFailure,itemID){
            $http.get("/_api/web/lists/getbytitle('Consultant%20Profile')/items?$filter=ID%20eq%20"+itemID).success(onSuccess).error(onFailure);

        }

      };
    });

   app.controller('ContactController', function(listData,$scope){

        //setTimeout(function(){console.log(Data)},2000);

        console.log("Controller called. Hello");

        var successFunction = function(data){
            $scope.resData = data;
            console.log("Success - ", data);
        }

        var failFunction - function(data){
            console.log("Didn't work - ", data);
        }

        //Now your functions are actually defined.
        listData.getData(successFunction,failFunction,curItemId);

    });

您不必使用var来声明函数,因为JavaScript仍然可以理解,但使用var使其成为local变量,而不使用var将其定义为global

我相信这会有所帮助。