简体   繁体   English

AngularJS:无法读取未定义的属性''

[英]AngularJS: Cannot read property '' of undefined

I´m trying to do something like this in AngularJS: 我想在AngularJS中做类似的事情:

.factory('TranslationService', function($location, $rootScope, $routeParams, $translate, $window, tmhDynamicLocale, 
                                            LocationService, MetaService) {
      return {
        translate: function(language, translateUrlName) {

            $translate.uses(language).then(function() {

                this.translateUrl(language, translateUrlName);
            });
         },
         translateUrl: function(language, translateUrlName) {
            // do whatever
        }
      };     
    })

But I don´t know why I´m getting this error: 但我不知道为什么我收到这个错误:

TypeError: Cannot read property 'translateUrl' of undefined
    at services.js:1117
    at deferred.promise.then.wrappedCallback (angular.js:6846)
    at angular.js:6883
    at Object.$get.Scope.$eval (angular.js:8057)
    at Object.$get.Scope.$digest (angular.js:7922)
    at Object.$get.Scope.$apply (angular.js:8143)
    at done (angular.js:9170)
    at completeRequest (angular.js:9333)
    at XMLHttpRequest.xhr.onreadystatechange (angular.js:9303)angular.js:5754 (anonymous function)angular.js:4846 $getangular.js:6848 deferred.promise.then.wrappedCallbackangular.js:6883 (anonymous function)angular.js:8057 $get.Scope.$evalangular.js:7922 $get.Scope.$digestangular.js:8143 $get.Scope.$applyangular.js:9170 doneangular.js:9333 completeRequestangular.js:9303 xhr.onreadystatechange

If I just move the call this.translateUrl(language, translateUrlName); 如果我只是调用this.translateUrl(language, translateUrlName); outside of translate: function(language, translateUrlName) { then it works, but I don´t get the correct behavior. translate: function(language, translateUrlName) {之外translate: function(language, translateUrlName) {然后它有效,但我没有得到正确的行为。

The standard trap with closures and this in Javascript. 带有闭包的标准陷阱, this在Javascript中。 Do: 做:

  return {
    translate: function(language, translateUrlName) {
        var self = this;

        $translate.uses(language).then(function() {
            self.translateUrl(language, translateUrlName);
        });
     },
     translateUrl: function(language, translateUrlName) {
        // do whatever
    }
  };     
})

change the code to 将代码更改为

.factory('TranslationService', function($location, $rootScope, $routeParams, 
         $translate, $window, tmhDynamicLocale, LocationService, MetaService) {

    function translateUrl(language, translateUrlName) {
            // do whatever
        }

      function translate(language, translateUrlName) {

            $translate.uses(language).then(function() {

                translateUrl(language, translateUrlName);
            });
         }

      return {
        translate: translate,
         translateUrl: translateUrl
      };     
    })

its better to use named functions, as they do help in debugging... 最好使用命名函数,因为它们有助于调试...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM