Angularjs TypeError:无法读取属性';然后';m.$scope.profile处未定义的

Angularjs TypeError:无法读取属性';然后';m.$scope.profile处未定义的,angularjs,Angularjs,我正在尝试调用主控制器中的子服务函数 App.controller("globalCtrl", function($scope,$rootScope, $window, $location, $rootScope, $cookieStore, toastr, ClientService,) { var theClient = $cookieStore.get('UserData') || {}; $scope.profile = function(theClient) {

我正在尝试调用主控制器中的子服务函数

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, '');
                 }
              });
            }
          }
      };
)};
但是我在配置文件函数中得到的
错误。
这是主控制器内的我的配置文件功能

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, '');
                 }
              });
            }
          }
      };
)};
这是另一个控制器的服务,我正在调用profile函数“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);
        }
    }
});

我需要帮助。我想不出这个问题。提前谢谢

我不确定这是否有效,但您是否尝试将它们声明为factory对象的一部分,而不是返回包含函数的对象?我有一些是这样声明的,它们正在工作,因此请尝试:

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及其副本):


我不确定这是否有效,但不是返回包含函数的对象,而是尝试将它们声明为factory对象的一部分吗?我有一些是这样声明的,它们正在工作,因此请尝试:

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及其副本):

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

        if(theClient.OrganizationId) {
            //API Call
            var promise = ... some stuff ...;
        }
        return promise;
因此,如果条件为false,则返回不具有
未定义的
属性

您应该确保返回承诺的函数总是返回承诺。如果您想表明缺少的id是一个错误,那么只需返回已被拒绝的承诺的
$q.reject(something)

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

        if(theClient.OrganizationId) {
            //API Call
            var promise = ... some stuff ...;
        }
        return promise;
因此,如果条件为false,则返回没有
属性的
undefined


您应该确保返回承诺的函数总是返回承诺。如果您想表明丢失的id是一个错误,那么只需返回
$q.reject(something)
,以获取已被拒绝的承诺。

将您的服务更改为只返回
承诺
,然后使用
在控制器中处理该承诺

ClientService.getClient(getOrganizationId).then(function(){},function(){})
服务直接返回API调用,no
,然后在
service

var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER)
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,''];
                });
            }
          }
      };
)};
这是您的服务:

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);
        }
    }
});
现在,控制器使用
然后

ClientService.getClient(getOrganizationId).then(function(){},function(){})
这是您的控制器,请观察
然后

var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER)
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,''];
                });
            }
          }
      };
)};

将您的服务更改为只返回一个
承诺
,然后使用
在控制器中处理该承诺

ClientService.getClient(getOrganizationId).then(function(){},function(){})
服务直接返回API调用,no
,然后在
service

var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER)
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,''];
                });
            }
          }
      };
)};
这是您的服务:

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);
        }
    }
});
现在,控制器使用
然后

ClientService.getClient(getOrganizationId).then(function(){},function(){})
这是您的控制器,请观察
然后

var promise = $http.get(API_URL.GET_CLIENT+theClient.OrganizationId+"&CorrelationId="+uuid2.newuuid()+"&ContextOrganizationId=009", REQUEST_HEADER)
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,''];
                });
            }
          }
      };
)};

尝试这样做,以确保始终存在可用的
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;
}

尝试这样做,以确保始终存在可用的
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;
}

在else部分中,您可以返回带有resolve(
$q.resolve()
)或reject(
$q.reject()
)状态的虚拟承诺

JS:

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

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

//check error here
});

在else部分中,您可以返回带有resolve(
$q.resolve()
)或reject(
$q.reject()
)状态的虚拟承诺

JS:

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

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

//check error here
});


第一行
ClientService,
中有语法错误,这是打字错误吗?如果是,则错误指向哪一行?错误在哪里?它们不是任何错误
clientService
之后的代码第一行中不会有“,”。应该是打字错误。检查我的答案。您在第一行
ClientService,
中有语法错误,这是打字错误吗?如果是,则错误指向哪一行?错误在哪里?它们不是任何错误
clientService
之后的代码第一行中不会有“,”。应该是打字错误。检查我的答案。它是ant-defer模式。不推荐编辑ant-defer模式。不推荐如果我删除此条件,则在http调用参数中出现错误,该参数找不到组织,因此,如果条件为false,则必须创建一个不同的承诺,在无法发送请求的情况下解析或拒绝您想要使用的任何内容。抱歉,不。我回答了问题,但这不是代码编写服务。如果删除此条件,则在http调用参数中会出现错误,无法找到OrganizationId,因此,如果条件为false,您必须创建一个不同的承诺,在无法发送请求的情况下解析或拒绝您想要使用的任何内容。对不起,没有。我回答了问题,但这不是一个代码编写服务。我认为如果block
,代码将不会
。请检查我的更新答案。现在我在控制器函数(aGetClientResponse){//错误回调返回[aGetClientResponse.status',];是的,因为我们返回的是空响应,状态将是未定义的,请将第二个函数更改为
函数(aGetClientResponse){console.log('发生错误)})
显然现在日志已经打印出来了。所以,至少现在错误没有出现?问题是
var theClient=$cookieStore.get('UserData')|{};
如果(theClient.OrganizationId),这个条件失败了
如果代码阻塞,我想代码不会
。请检查我更新的答案。现在我在控制器函数(aGetClientResponse){//错误回调返回[aG]中得到错误