javascript AngularJS:无法读取未定义的属性“”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/28896223/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
AngularJS: Cannot read property '' of undefined
提问by Rober
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);
outside of translate: function(language, translateUrlName) {
then it works, but I don′t get the correct behavior.
如果我只是将呼叫移到this.translateUrl(language, translateUrlName);
外面,translate: function(language, translateUrlName) {
那么它可以工作,但我没有得到正确的行为。
回答by Nikos Paraskevopoulos
The standard trap with closures and this
in Javascript. Do:
带有闭包和this
Javascript的标准陷阱。做:
return {
translate: function(language, translateUrlName) {
var self = this;
$translate.uses(language).then(function() {
self.translateUrl(language, translateUrlName);
});
},
translateUrl: function(language, translateUrlName) {
// do whatever
}
};
})
回答by harishr
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...
最好使用命名函数,因为它们确实有助于调试......