AngularJS使用bind(this)

时间:2015-07-24 22:31:22

标签: javascript html angularjs

我最近转而使用控制器中的“ this ”和ngRoute和Directives中的 controllerAs ,而不是直接使用 $ scope 。虽然我真的很喜欢代码的外观,但我必须手动将“this”绑定到每个函数。

示例:

app.controller('mainController', function ($scope, Restangular) {
    this.title = '';

    $scope.$on('changeTitle', function (event, data) {
        this.title = data;
    }.bind(this)); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

});

我明白为什么必须这样做(“”上下文不断变化),我应该考虑做更好的解决方案(更干净,更实用)?

感谢。

3 个答案:

答案 0 :(得分:7)

ES6中的胖箭头功能专门用于解决此问题。使用胖箭头函数可以继承父作用域的上下文,因此您不必再使用bind或signed char。所以你可以调查一下。

var that = this

Angular 2是用ES6编写的,使用了Traceur编译器:http://angularjs.blogspot.sg/2014/03/angular-20.html,这里有一篇关于如何在自己的代码中使用它的简短帖子:http://www.benlesh.com/2014/03/traceur-is-awesome-but-still-little.html

答案 1 :(得分:3)

最简单的方法是将this放在一个对象中。

app.controller('mainController', function ($scope, Restangular) {
  var self = this;
  self.title = ''; 

  $scope.$on('changeTitle', function (event, data) {
    self.title = data;     // Due to scope inheritance in javascript, self is defined here.   
  });

});

这个版本也是许多角色用户的最佳实践,包括John Papa(他称之为vm而不是self)。

https://github.com/johnpapa/angular-styleguide#style-y032

答案 2 :(得分:0)

你可以使用

  

Angular.bind(this,function(){})

如上所述here 并在此answer

所以你会有类似的东西:

this.defaultCity = 'myvalue';
callHttpService(this.defaultCity).then(angular.bind(this, function(res) {
    this.defaultCity = res.data;
}));