3

我在寫一個指令並試圖堅持John Papa style guide。所以我也決定跳上ControllerAs語法旅行車和我有一個微小的指令如下圖所示:AngularJS ControllerAs語法和控制器注入變量

(function() { 
    angular 
     .module('htApp') 
     .directive('newsletterSignup', newsletter_signup); 

    function newsletter_signup($http) { 
     var directive = { 
      templateUrl: '../whatever.tpl.html', 
      restrict: 'EA', 
      controller : controller, 
      controllerAs: 'vm', 
      bindToController: true 
     }; 

     return directive; 

     controller.$inject = ['$http']; 

     function controller($http) { 
      var vm = this; 
      // $http is here ... all is good, but I don't need it 

      function doSubmit(form) { 
       // I need $http here, but it is null 
       debugger; 
      }; 

      vm.doSubmit = doSubmit; 
     } 
    } 
})(); 

這是一個簡報註冊服務。我將不得不做一個HTTP請求,因此我將它注入到控制器中。一切正常 - 但從模板中調用vm.doSubmit(--formname-here--)函數會導致我無法找到$http服務。

所以我的問題:我怎樣才能從doSubmit()功能訪問注入$http

編輯

我會包括視圖代碼 - 但沒有後顧之憂 - 管道工程:

<button class="btn btn-yellow" ng-click="vm.doSubmit(newsletterform)" translate> 
    footer.ok_button_text 
</button> 

EDIT 2

事實證明,@Tek是正確 - 代碼有效。我認爲我沒有看到它的原因是因爲(我認爲)Chrome中的JS運行時知道它不會被調用時優化了$http

code_works

此代碼工作正常。我認爲這是因爲運行時預計在console.log()函數調用中使用$http。但是 - 如果我刪除了這一行我得到這個(這就是爲什麼我在首位這個問題):

$http not available

請注意,我註釋掉console.log - 因此doSubmit()電話從不使用$http。現在 - 當我在控制檯中撥打$http時 - 沒有定義。

回答

0

你的例子工作得很好:example

但是,對於我約翰帕帕有非常奇怪的視角風格,我更喜歡this style guide

+0

這很奇怪 - 不能讓它自己工作。有趣的風格指南 - 我今天早上剛剛閱讀這傢伙的博客。使用John Papa's的原因是因爲我聽說它會使轉換到Angular v2更容易。 –

+0

我想出了問題所在 - 你可能會對我更新的問題感興趣。 –

1

的問題是在這裏:當執行return聲明

return directive; 

controller.$inject = ['$http']; 

function controller($http) { 
... 

controller函數的定義。但controller.$inject將永遠不會被定義。另外,newsletter_signup功能會錯過相應的$inject

This正確地不會是minified。而this將爲minified

+0

謝謝,但我不認爲這是問題所在。代碼正常運行 - 我認爲由於運行時優化,我得到了NullRef異常。我會更新我的帖子來演示。 –

+0

'$ inject'適用於代碼縮小。縮小代碼並查看會發生什麼。 – estus

+0

謝謝 - 但正如我所說的 - 接線'$ http'工作得很好。也縮小了。看看我更新的問題,雖然 - 我偶然發現了一個不錯的怪癖。 –

相關問題