Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS';这';$timeout函数中的引用不起作用_Javascript_Angularjs_Timeout - Fatal编程技术网

Javascript AngularJS';这';$timeout函数中的引用不起作用

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.

我有一个AngularJS的问题,让我发疯。我有一个类似这样的服务(这是一个例子来说明这个问题)

我的控制器如下所示:

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);
    }
})