使用controllerAs的Angular JS和带有范围或此变量的此语法

时间:2016-02-22 07:17:49

标签: javascript angularjs this angularjs-controlleras

我总是遇到一个问题,导致与控制器范围变量的定义不一致。

您可能知道使用 controllerAs 语法,您必须在控制器功能中附加实例的所有变量,如下所示:

angular.module('angularJsInternationalizationApp')
  .controller('MainCtrl', function (SampleService) {
    this.awesomeThings = [
      'HTML5 Boilerplate',
      'AngularJS',
      'Karma'
    ];

    this.translatedFromService = '';
    SampleService.getTranslation().then(function(data){
        this.translatedFromService = data;
    });
  });

现在问题是 this.translatefDromService 无法从任何服务的成功错误功能进行更新,或者事实上其他功能,因为它将此作为新功能的实例而不是控制器。

在这种情况下可以做些什么。

我使用了一个解决方案,你可以将其标记为vm。 控制器开头的 var vm = this 但除此之外还有解决办法吗?

干杯!

1 个答案:

答案 0 :(得分:1)

您有两个选择:

1)使用vm = this方法,保持与控制器this上下文的链接:

angular.module('angularJsInternationalizationApp')
  .controller('MainCtrl', function (SampleService) {
    var vm = this;
    vm.awesomeThings = [
      'HTML5 Boilerplate',
      'AngularJS',
      'Karma'
    ];

    vm.translatedFromService = '';
    SampleService.getTranslation().then(function(data){
        vm.translatedFromService = data;
    });
  });

2)在处理程序上使用bind() method,它会将调用函数的上下文修改为控制器this

angular.module('angularJsInternationalizationApp')
  .controller('MainCtrl', function (SampleService) {
    this.awesomeThings = [
      'HTML5 Boilerplate',
      'AngularJS',
      'Karma'
    ];

    this.translatedFromService = '';
    SampleService.getTranslation().then(function(data){
        this.translatedFromService = data;
    }.bind(this));
  });