AngularJS自定義Directive與controller的交互

 

有時候,自定義的Directive中須要調用controller中的方法,即Directive與controller有必定的耦合度。

好比有以下的一個controller:app

 

app.controller('MyCtrl',function($scope){
   $scope.load = function(){
       console.log('loading more...')
   }
});

 

如今自定義一個Direcitve,須要調用MyCtrl這個controller中的load方法。函數

 

app.directive('enter', function(){
    return function($scope, ele, attrs){
        ele.bind('mouseenter', function(){
            $scope.load();
        })
    }
})

 

頁面這樣調用:編碼

 

 <div ng-controller="MyCtrl">
    <div enter>enter to load more</div>
  </div>

 

若是想調用MyCtrl中的其它方法呢?這時候就須要更改direcitve中的編碼。因而可知在directive以硬編碼的方法是調用controller中的方法是不太合理的。

那麼把變化的可能性放在頁面上會怎樣呢?

給enter一個屬性值,該屬性值表示調用哪一個方法。

spa

  <div ng-controller="MyCtrl">
    <div enter="load()">enter to load more</div>
  </div>
  

 

這樣,總比在directive中硬編碼要靈活一些。

directive相應改爲這樣:code

 

app.directive('enter', function(){
    return function($scope, ele, attrs){
        ele.bind('mouseenter', function(){
            $scope.$apply('load()');
        })
    }
})

 

但是,以上寫法還不是最合理的,由於在調用上下文的$apply方法的時候傳入的實參也是字符串。

別忘了,link函數中還有一個形參attrs,經過這個能夠獲取任意屬性值。blog

 

app.directive('enter', function(){
    return function($scope, ele, attrs){
        ele.bind('mouseenter', function(){
            $scope.$apply(attrs.enter);
        })
    }
})
相關文章
相關標籤/搜索