2017-03-02 155 views
0

我廣播了一個事件langChange來完成本地化。 這裏的問題是找到一個優雅的方式來呼籲this.loadContent()進入該控制器附加的頁面上,當langChange也被觸發。 那bind(this)沒有做我想要的東西,我猜。角度上下文綁定

我會避免this別名解決方案,如var $this=this; [...]

app.controller('ctrl', ["$scope","Service", 
    function($scope,Service){ 
     this.loadContent = (function(){ 
       Service 
        .getSection() 
        .then(function (res) { 
         $scope.content = res.data.template; 
        }); 
     }()); 
     $scope.$on('langChange', (function(){ 
      this.loadContent(); 
     }).bind(this)); 
}]); 

編輯:基於@Petr Averyanov答案我嘗試了以下解決方案,但loadContentlangChange被觸發甚至沒有叫。

app.controller('ctrl', ["$scope","Service", 
    function($scope,Service){ 
     console.log("loading content..") 
     var _this = this; 
     _this.loadContent = function(){ 
       console.log("load") 
       tutorialService 
        .getSection() 
        .then(function (res) { 
         $scope.content = res.data.template; 
        }); 
     }(); 
     $scope.$on('langChange', _this.loadContent); 
}]); 

我也嘗試了一個在他的評論後,我得到_this.loadContent is not a function我想還是有背景的問題...

回答

0

應該是:

app.controller('ctrl', ["$scope","Service", 
    function($scope,Service){ 
     var vm = this; 
     vm.loadContent = function(){ 
       Service 
        .getSection() 
        .then(function (res) { 
         $scope.content = res.data.template; 
        }); 
     }(); 
     $scope.$on('langChange', vm.loadContent); 
     /* or 
      function() { 
      vm.loadContent(); 
      } 
     */ 
}]); 
+0

我知道了'this'別名解決方案。如果可能的話,我會避免這個解決方案 – alfredopacino

+0

@alfredopacino如果你知道一個可能的解決方案,但選擇不使用該解決方案,那麼你的問題應該更像是「我正在尋找一種不同的方式來解決這個問題」,以避免這種混淆,對於答覆者和其他可能有類似問題但不知道避免的解決方案的人員。 – Claies

+0

我編輯了更多的細節 – alfredopacino