2017-03-15 32 views
0

我一直在使用角度1.x 2年左右。我通常遵循一個配方,不要經常陷入困境。最近我開始嘗試新的方法,以更好地理解角和JavaScript。

我曾經相信我在javascript控制器中聲明的「vm」是鏈接(綁定)到html中聲明的data-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.var3 = {}裏面的$ scope。$上$ scope。$。函數內的其他所有屬性都將起作用。

如果我只是取代「本」」爲‘VM’遍控制器,事情會完全重新工作。

我在想,如果有人能解釋一下究竟是怎麼回事。

感謝。

回答

2

匿名函數傳遞給$範圍。在$()僅僅是一個普通的功能。這不是必然this。你需要使用

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

或使用ES6箭頭功能,可以自動做這(如果你的瀏覽器支持ES6,或者如果你transpile你到ES5代碼ES6):

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

或者,你已經做了到現在爲止,捕捉在一個局部變量的值this是由所有的功能捕獲:

var vm = this; 

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

坦率地說,如果你不準備使用ES6還沒有,我會繼續使用vm別名招(或使用$範圍,沒有這個問題)。

+0

嗨,謝謝你的回覆。我試過「scope.on」上的「.bind(this)」,它工作。不過,現在我在函數中遇到同樣的錯誤。我在「scope.on」中創建了一個變量,並試圖在另一個函數中使用它,但現在我在函數中得到了「vm is undefined」。我認爲這是全局變量的限定符,任何由它定義的變量在整個javascript源代碼中都是可見的。 – user2568276