2014-09-03 2 views
8

я указал функцию в моем контроллере, как это:IIFE в AngularJS

$scope.myFunction = function(){ console.log('test'); } 

Я хочу, чтобы эта функция должны быть включена, когда переключатель был изменен. Поэтому я применяю нг-изменения на выбора элемента, как это:

<select ng-options="..." ng-model="..." ng-change="myFunction();"></select> 

Но я также хочу, чтобы функция туРипсЫоп должна быть включена, когда моя страница загружается. Так что я подумал, чтобы превратить свою функцию в IIFE:

($scope.myFunction = function(){ console.log('test'); }()); 

Однако, теперь функция включается только на PageLoad и не нг-изменений. я заметил, что когда я изменяю скобку, функция также получает вызвана нг-изменения:

($scope.myFunction = function(){ console.log('test'); })(); 

Может кто-нибудь объяснить, почему это даже вопросы?

Спасибо большое!

+2

Первый вызов не является IIFE, второй. – helpermethod

+0

@helpermethod в соответствии с этой статьей http://benalman.com/news/2010/11/immediately-invoked-function-expression/, обе версии - это IIFE, с небольшими различиями. Такие параны обычно указывают, что выражение функции будет немедленно вызывается, а переменная будет содержать результат функции, а не сама функция. Это может спасти кого-то, читающего ваш код, проблемы с прокруткой вниз до того, что может быть очень длинным выражением функции, чтобы увидеть, было ли оно вызвано или нет. ' – Alex

ответ

9

Существует огромная разница между этим

($scope.myFunction = function(){ console.log('test'); }()); 

И этот

($scope.myFunction = function(){ console.log('test'); })(); 

Поскольку первая строка присваивает результат вызова функции, а затем только сохраняет его, но это не является функцией что он хранит.

Вторые работы, как ожидается, потому что вы вызываете функцию после закрепив ее $scope.myFunction

UPDATE

Как helpermethod указывалось в комментариях, первая строка не является IIFE, потому что вы не вызывая самой функции, а только ее результат.

+0

Хорошо, я понял это сейчас. Причина, по которой я делал первый, заключалась в том, что JSLint жаловался на «плохой вызов» этой функции. – PhillSlevin

5

Не видя всего вашего кода, сложно сказать. Вы не используете IIFE, вы выполняете свою собственную функцию и устанавливаете ее в переменную $ scope. Кроме того, IIFE не будет запускать его при загрузке страницы. Вместо того, чтобы пытаться исправить все это, попробуйте использовать код, как показано ниже.

Попробуйте создать контроллер в качестве IIFE и обновлении HTML, как это:

<div ng-controller="MyCtrl as vm"> 
    <select ng-options="vm.someOptions" 
     ng-model="vm.someModel" 
     ng-change="vm.myFunction()"></select> 
</div> 

и контроллер

(function(){ 
    angular.module('myapp').controller('MyCtrl', MyCtrl); 

    function MyCtrl() { 
     var vm = this; 

     vm.someModel; 
     vm.someOptions = []; // set these 
     vm.myFunction = myFunction; 

     activate(); 

     function activate() { 
      myFunction(); 
     } 

     function myFunction() { 
      // TODO: will be called onchange and 
      // when controller starts 
     } 

    } 

})(); 
Смежные вопросы