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.

Так что мой вопрос: как я могу получить доступ к введенному $http от функции doSubmit()?

EDIT

Я буду включать код вида - но не беспокойтесь - сантехника работает:

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

EDIT 2

Как выясняется, @Tek был right - код работает. Я думаю, что причина, по которой я этого не видел, состояла в том, что (я думаю) JS runtime в Chrome оптимизирует $http, когда он знает, что это не будет вызвано.

code_works

Этот код работает отлично. Я думаю, что это связано с тем, что во время выполнения было задействовано использование $http в вызове функции console.log(). Однако - если я удалю эту линию я получаю это (именно поэтому я имел эту проблему в первую очередь):

$http not available

Обратите внимание, что я закомментировал console.log - таким образом doSubmit() вызов не использует $http. Теперь - когда я вызываю $http в консоли - он не определен.

ответ

0

Ваш пример отлично работает: example.

Но у меня у Джона Папы довольно странное видение углового стиля, я предпочитаю this style guide.

+0

Это странно - не может заставить его работать самостоятельно. Интересный стиль руководства - я просто читал блог этого парня сегодня утром. Причина использования John Papa's заключается в том, что я слышал, что это облегчит переход на Angular v2. –

+0

Я понял, в чем проблема: вас может заинтересовать мой обновленный вопрос. –

1

Проблема здесь:

return directive; 

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

function controller($http) { 
... 

controller функция определена при выполнении return заявление. Но controller.$inject никогда не будет определяться. Также функция newsletter_signup пропускает соответствующие $inject.

This не будет minified должным образом. Пока this будет minified.

+0

спасибо, но я не думаю, что это проблема.Код работает, как оказалось - я думаю, что из-за оптимизации времени выполнения я получил исключение NullRef. Я обновляю свой пост, чтобы продемонстрировать. –

+0

'$ inject' относится к минимизации кода. Измените код и посмотрите, что произойдет. – estus

+0

Спасибо, но, как я уже сказал, электропроводка '$ http' работает просто отлично. Также уменьшено. Проверьте мой обновленный вопрос, хотя - я наткнулся на приятную причуду. –