Angularjs javascript这与$SCOPE.$ON

Angularjs javascript这与$SCOPE.$ON,angularjs,virtual-machine,this,Angularjs,Virtual Machine,This,我已经在angular 1.x上工作了两年左右。我通常按照食谱行事,以免经常惹麻烦。最近,为了更好地理解angular和javascript,我开始尝试新的方法 我过去认为我在javascript控制器中声明的“vm”是html中声明的数据ng controller=“mycontroller as vm”的链接(绑定)。我刚刚了解到,我可以用不同的名字来命名它们,而这种束缚仍然会完美地发生 然后,我决定停止在控制器中声明“vm”内容,并开始使用本机javascript“this”限定符 我尝试

我已经在angular 1.x上工作了两年左右。我通常按照食谱行事,以免经常惹麻烦。最近,为了更好地理解angular和javascript,我开始尝试新的方法

我过去认为我在javascript控制器中声明的“vm”是html中声明的数据ng controller=“mycontroller as vm”的链接(绑定)。我刚刚了解到,我可以用不同的名字来命名它们,而这种束缚仍然会完美地发生

然后,我决定停止在控制器中声明“vm”内容,并开始使用本机javascript“this”限定符

我尝试了以下方法:

angular.module('app')
    .controller('Customers', [function() {
 //   var vm = this;
      this.title = 'Customers';
      this.customers = [
        {name: 'Haley'}, {name: 'Ella'}, {name: 'Landon'}, {name: 'John'}
        ];


    function 1stFunction () {
        this.obj1 = {}; 
    ;



    function 2ndFunction () {
        this.var2 = {};     
    ;


    $scope.$on('myListener', function() {
        this.var3 = {};
    });

    }]);
令我惊讶的是,当我运行应用程序时,我得到了一条“this not defined”消息(或与此相近的消息),它引用了$scope.$on中的this.var3={}。只有$scope.$on中的属性。函数中的所有其他属性都将起作用

如果我只是在整个控制器中将“this”替换为“vm”,事情将再次完美地工作

我想知道是否有人能解释到底发生了什么


谢谢。

您传递给$scope的匿名函数。$on()只是一个常规函数。它不绑定到此。您需要使用

 $scope.$on('myListener', function() {
    this.var3 = {};
 }.bind(this));
或者使用ES6箭头功能自动执行此操作(如果您的浏览器支持ES6,或者如果您将代码从ES6传输到ES5):

或者,正如您到目前为止所做的那样,在由所有函数捕获的局部变量中捕获
this
的值:

var vm = this;

// no risk of not binding this anymore
$scope.$on('myListener', function() {
    vm.var3 = {};
});

坦白地说,如果您还没有准备好使用ES6,我会继续使用
vm
别名技巧(或者使用$scope,它没有这个问题)。

传递给$scope的匿名函数。$on()只是一个常规函数。它不绑定到
这个
。您需要使用

 $scope.$on('myListener', function() {
    this.var3 = {};
 }.bind(this));
或者使用ES6箭头功能自动执行此操作(如果您的浏览器支持ES6,或者如果您将代码从ES6传输到ES5):

或者,正如您到目前为止所做的那样,在由所有函数捕获的局部变量中捕获
this
的值:

var vm = this;

// no risk of not binding this anymore
$scope.$on('myListener', function() {
    vm.var3 = {};
});

坦白地说,如果您还没有准备好使用ES6,我会继续使用
vm
别名技巧(或者使用$scope,它没有这个问题)。

hi,谢谢您的回答。我尝试了.bind(this)“on”scope.on“并成功了。但是,现在我在函数中遇到了相同的错误。我在“scope.on”中创建了一个变量并尝试在另一个函数中使用它,但现在我在函数中得到“vm未定义”。我认为这将是全局变量的限定符,并且由它限定的任何变量都将在整个javascript源代码中可见。您好,感谢您的回复。我在“scope.on”上尝试了“.bind(this)”并成功了。但是,现在我在函数中得到了相同的错误。我在“scope.on”中创建了一个变量,并试图在另一个函数中使用它,但现在我在函数中得到了“vm未定义”。我认为这将是全局变量的限定符,任何由它限定的变量都将在整个javascript源代码中可见。