2015-11-09 28 views
4

我看到以下問題(其他類似的問題中),它解決了試圖工廠注入到一個指令的鏈接功能的問題: Injecting service to Directive進樣工廠到指令的範圍之外定義指令的鏈接功能

的我見過保持指令範圍內的鏈接功能的解決方案:

angular.module('myapp') 
    .directive('myDir', function(myService){ 
     return { 
      restrict: 'E', 
      scope: { 
       frame: '=' 
      }, 
      link: function postLinkFn(scope, elem, attr) { 
       myService.doSomething(); 
      } 
     }; 
    }); 

不過,我希望能夠給postLinkFn爲組織.directive範圍之外分開,就像我可以做的控制器。

是否有可能分開這個功能,同時也注入了一個服務?

回答

5
.directive('myDir', function(myService){ 
    var deps = { myService: myService }; 

    return { 
     ... 
     // myService is available as this.myService inside postLinkFn 
     link: angular.bind(deps, postLinkFn) 
    }; 
}); 

link功能不使用依賴注入,沒有詞彙this,注入依賴結合this是合理之舉。

+0

很有意思。謝謝! – ThinkBonobo

+0

感謝它爲我工作,在鏈接功能,我使用this.myService,它的作品就像一個魅力。非常感謝你。 – AshD

+1

@AshD不客氣。應該注意的是,目前正確的方法是使用$ postLink控制器鉤子而不是鏈接功能。 – estus

1

當然,您可以將您的代碼放入工廠,然後在整個應用程序中全局引用它。

angular.module('myapp').factory('myfactory', myService, function(){ 
return{ 
var myfac; 
my fac = function (myService){ 
    var myItem = myService.doSomething; 
    return myItem; 
}; 

}; 
}). 
.directive('myDir', function(myService){ 
    return { 
     restrict: 'E', 
     scope: { 
      frame: '=' 
     }, 
     link: myfactory.myItem; 
    }; 
});' 

如果你的服務處理異步調用,你需要做的只是將你的工廠綁定到角度承諾$ q。

+0

謝謝薩欽。這也是一個有效的選擇,但我希望有一件事我可以做,那就是直接函數調用,而不是角包裹調用。比如使用控制器,我可以通過它將要注入的參數傳遞給它。也許鏈接功能不提供此功能。 – ThinkBonobo