TypeError:无法读取属性'然后'在m。$ scope.profile中未定义的

时间:2017-03-29 12:12:52

标签: angularjs

我正在尝试在主控制器中调用子服务功能。

但是我在个人资料功能中遇到than错误。 这是我在主控制器内的配置文件功能。

App.controller("globalCtrl", function($scope,$rootScope, $window, $location, $rootScope, $cookieStore, toastr, ClientService,) {
  var theClient = $cookieStore.get('UserData') || {};

  $scope.profile = function(theClient) {

              var getCurrentClient = theClient;
              var getOrganizationId = $rootScope.globalSession.OrganizationId;    
            if($rootScope.globalSession.UserRole == "Admin")
             {          
               if (getOrganizationId) {       

               ClientService.getClient(getOrganizationId).then(function(aGetClientResponse) {

                if(getClientResponse[0] == $scope.RESPONSE_CODE.CM_SUCCESS) {

                        $scope.myprofile = getClientResponse[1];
                        $location.path("/profile");
                }
                else { 
                    toastr.warning($scope.USER_MESSAGE.SERVICE_NOT_AVAILABLE, '');
                 }
              });
            }
          }
      };
)};

这是另一个控制功能的服务" getClient "我打电话给个人资料。

App.factory('ClientService', function($http, $cookieStore, uuid2, API_URL, REQUEST_HEADER, RESPONSE_CODE) {
    var theClient = $cookieStore.get('UserData') || {};

    return {

        getClient: function() {

            if(theClient.OrganizationId) {
                //API Call
                var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER).then(
                function(aGetClientResponse) { //Success Callback

                    return [aGetClientResponse.data.GetClientResponse.Result.ResponseCode, aGetClientResponse.data.GetClientResponse];
                },
                function(aGetClientResponse) { //Error Callback
                    return [aGetClientResponse.status,''];
                });
            }
            return promise;
        },
        setClient: function(aClient) {
            theClient = aClient;
            $cookieStore.put('UserData', theClient);
        }
    }
});

需要帮助。无法弄清楚问题。提前谢谢!

5 个答案:

答案 0 :(得分:1)

我不确定这是否有效,但是您是否尝试将它们声明为工厂对象的一部分,而不是返回具有内部函数的对象?我有一些声明这样,他们正在工作,所以试试看:

App.factory('ClientService', function($http, $cookieStore, uuid2, API_URL, REQUEST_HEADER, RESPONSE_CODE) {
    var theClient = $cookieStore.get('UserData') || {};

    var function = {
        getClient: function() {

            if(theClient.OrganizationId) {
                //API Call
                var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER).then(
                function(aGetClientResponse) { //Success Callback

                    return [aGetClientResponse.data.GetClientResponse.Result.ResponseCode, aGetClientResponse.data.GetClientResponse];
                },
                function(aGetClientResponse) { //Error Callback
                    return [aGetClientResponse.status,''];
                });
            }
            return promise;
        },
        setClient: function(aClient) {
            theClient = aClient;
            $cookieStore.put('UserData', theClient);
        }
    }
    return function;
});

你也可以试试这个:

在控制器声明中定义服务(并删除一个rootScope,它是重复的):

App.controller("globalCtrl", ['$scope','$rootScope','$window','$location','$cookieStore','toastr','ClientService', function($scope,$rootScope, $window, $location, $cookieStore, toastr, ClientService){
   [...]
}]);

答案 1 :(得分:1)

getClient()中,代码如下所示:

        if(theClient.OrganizationId) {
            //API Call
            var promise = ... some stuff ...;
        }
        return promise;

因此,如果条件为假,则返回undefined,但不具有.then属性。

您应确保返回promise的函数始终返回promise。如果您想要发出缺少的ID是错误的信号,那么只需返回$q.reject(something)以获取已被拒绝的承诺。

答案 2 :(得分:1)

将您的服务更改为仅返回promise并使用then

在您的控制器中处理该承诺

该服务直接返回API调用,then

service
var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER)

以下是您的服务:

App.factory('ClientService', function($http, $cookieStore, uuid2, API_URL, REQUEST_HEADER, RESPONSE_CODE, $q) {
    var theClient = $cookieStore.get('UserData') || {};

    return {

        getClient: function() {

            if(theClient.OrganizationId) {
                var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER)
            }
        else {
             var promise =  $q.reject();
        }
            return promise;
        },
        setClient: function(aClient) {
            theClient = aClient;
            $cookieStore.put('UserData', theClient);
        }
    }
});

现在,控制器使用response处理成功与失败 then

ClientService.getClient(getOrganizationId).then(function(){},function(){})

以下是您的控制器,请观察then

App.controller("globalCtrl", function($scope,$rootScope, $window, $location, $cookieStore, toastr, ClientService) {
  var theClient = $cookieStore.get('UserData') || {};

  $scope.profile = function(theClient) {

              var getCurrentClient = theClient;
              var getOrganizationId = $rootScope.globalSession.OrganizationId;    
            if($rootScope.globalSession.UserRole == "Admin")
             {          
               if (getOrganizationId) {       

               ClientService.getClient(getOrganizationId).then(function(aGetClientResponse) {
               var response = [aGetClientResponse.data.GetClientResponse.Result.ResponseCode, aGetClientResponse.data.GetClientResponse];

                if(response[0] == $scope.RESPONSE_CODE.CM_SUCCESS) {

                        $scope.myprofile = response[1];
                        $location.path("/profile");
                }
                else { 
                    toastr.warning($scope.USER_MESSAGE.SERVICE_NOT_AVAILABLE, '');
                 }
              },
                function(aGetClientResponse) { //Error Callback
                    return [aGetClientResponse.status,''];
                });
            }
          }
      };
)};

答案 3 :(得分:1)

尝试这样的操作以确保始终有promise个对象。

getClient: function() {

    var deferred = $q.defer();

    if(theClient.OrganizationId) {
        //API Call
       $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER).then(
        function(aGetClientResponse) { //Success Callback
            deferred.resolve(aGetClientResponse);
        },
        function(aGetClientResponse) { //Error Callback
            deferred.resolve(aGetClientResponse);
        });
    }else{
        deferred.reject('Missing OrganizationId');
    }   

    return deferred.promise;
}

答案 4 :(得分:1)

在else部分中,您可以通过解析($q.resolve())或拒绝($q.reject())状态返回虚拟承诺。

JS:

getClient: function() {

            if(theClient.OrganizationId) {
                //API Call
                var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER).then(
                 ///your rest code
                return promise;
            }else{
                 return $q.reject();
            }

        }

使用$q.reject()它将在配置文件调用中调用错误处理程序。因此,将错误处理程序回调添加为第二个参数

ClientService.getClient(getOrganizationId).then(function(aGetClientResponse) {
//success code
},
function(){ //add it in your script

//check error here
});