Javascript AngularJS';这';$timeout函数中的引用不起作用
我有一个AngularJS的问题,让我发疯。我有一个类似这样的服务(这是一个例子来说明这个问题) 我的控制器如下所示:Javascript AngularJS';这';$timeout函数中的引用不起作用,javascript,angularjs,timeout,Javascript,Angularjs,Timeout,我有一个AngularJS的问题,让我发疯。我有一个类似这样的服务(这是一个例子来说明这个问题) 我的控制器如下所示: var app = angular.module('test-module', []); var ctrl = app.controller('main-controller', function($scope, ToolService) { $scope.somethingWasClicked = function() { ToolService.
var app = angular.module('test-module', []);
var ctrl = app.controller('main-controller', function($scope, ToolService) {
$scope.somethingWasClicked = function() {
ToolService.runTimeoutExample();
}
});
问题是,当单击的按钮调用$scope.somethingWasClicked时,它将调用转发到服务,我收到一个错误,说“this.doSomething不是函数”
为什么??我该如何解决这个问题?我很难找到一种方法,在不向控制器中添加不必要的逻辑的情况下,让代码像这样运行
提前感谢您的帮助超时内的函数具有不同的作用域,因为它不是属于控制器的函数。在超时之前,将此分配给变量,然后使用该变量:
var app = angular.module('test-module');
app.service('ToolService', function($timeout){
this.doSomething = function() {
console.log("y u no referenced as method?!?");
}
this.runTimeoutExample = function(){
var self = this;
$timeout(function(){
self.doSomething();
}, 1000);
}
})
您有两种选择:
1) 使用函数对象的bind()
方法:
更改超时回调的上下文,以到达控制器此
:
this.runTimeoutExample = function(){
$timeout(function(){
this.doSomething();
}.bind(this), 1000);
}
2) 创建一个特殊变量self
,以保持与主服务功能上下文的链接:
var app = angular.module('test-module');
app.service('ToolService', function($timeout){
var self = this;
self.doSomething = function() {
console.log("y u no referenced as method?!?");
}
self.runTimeoutExample = function(){
$timeout(function(){
self.doSomething();
}, 1000);
}
})
如果每次使用self
,您将确保不会发生上下文丢失
关于函数的上下文。
var-app=angular.module('test-module',[]);
应用程序服务('ToolService',函数($timeout){
函数doSomething(){
log(“你没有被引用为方法?!?”);
}
this.runTimeoutExample=函数(){
$timeout(函数(){
doSomething();
}, 1000);
}
});
应用控制器('main-controller',函数($scope,ToolService){
$scope.somethingWasClicked=function(){
ToolService.runTimeoutExample();
};
});代码>
这也适用于我,感谢您的快速响应@_camino很乐意提供帮助。我选择了bind方法,因为在我的实际代码中,在超时时间之上还有一层上下文,而绑定似乎是传递消息的一种更干净的方式reference@the_camino听起来是个好办法。bind()
的问题是每次都需要编写:)。请查看
var app = angular.module('test-module');
app.service('ToolService', function($timeout){
var self = this;
self.doSomething = function() {
console.log("y u no referenced as method?!?");
}
self.runTimeoutExample = function(){
$timeout(function(){
self.doSomething();
}, 1000);
}
})