IIFE в AngularJS
Я указал функцию в моем контроллере следующим образом:
$scope.myFunction = function(){ console.log('test'); }
Я хочу, чтобы эта функция запускалась при изменении selectbox. Поэтому я применяю ng-change к элементу select следующим образом:
<select ng-options="..." ng-model="..." ng-change="myFunction();"></select>
но я также хочу, чтобы функция myFunction запускалась при загрузке моей страницы. Поэтому я решил превратить свою функцию в жизнь:--5-->
($scope.myFunction = function(){ console.log('test'); }());
однако теперь функция запускается только на pageload, а не ng-change. Я заметил что когда я меняю скобки, функция также запускается ng-change:
($scope.myFunction = function(){ console.log('test'); })();
может кто-нибудь объяснить, почему это так важно?
большое спасибо!
2 ответов
есть огромная разница между этим
($scope.myFunction = function(){ console.log('test'); }());
и
($scope.myFunction = function(){ console.log('test'); })();
потому что первая строка присваивает результат вызова функции, а затем только сохраняет его, но это не функция, которую она хранит.
второй работает так, как ожидалось, потому что вы вызываете функцию после ее назначения $scope.myFunction
обновление
As helpermethod указано в комментариях, первая строка не является IIFE, потому что вы не вызываете саму функцию, а только ее результат.
не видя всего кода, трудно сказать. Вы не используете 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
}
}
})();