2017-01-10 5 views
4

Есть ли разница между использованием Controller1 vs Controller2?

angular.module('app', []) 
.component('foo', { 
    templateUrl: 'foo.html', 
    bindings: { 
     user: '<', 
    }, 
    controller: Controller1, //Or Controller2 
}); 

function Controller1(){ 
    this.$onInit = function(){ 
     this.user = angular.copy(this.user); 
    }; 

    this.$onChanges = function(changes){ 
     if(changes.user && !changes.user.isFirstChange()){ 
     this.user = angular.copy(changes.user.currentValue); 
     } 
    }; 
} 


function Controller2(){ 
    this.$onChanges = function(changes){ 
     if(changes.user){ 
     this.user = angular.copy(changes.user.currentValue); 
     } 
    }; 
} 

Почему я должен беспокоиться $onInit, когда я могу просто сделать то же самое в этом $onChanges и сохранить несколько строк?

Этот тип инициализации лучше в $onChanges и $onInit лучше для какой-либо другой инициализации?

ответ

0

$ OnInit

Вызывается на каждом контроллере после всех контроллеров на элементе, были построены и имели их привязок инициализируется (и перед предварительно & пост связывания функций для директив по этому элементу). Это хорошее место для ввода кода инициализации для вашего контроллера.

$ onChanges

onChanges жизненный цикл крючок $ вызывается по нескольким причинам. Во-первых, это инициализация компонента, она передает вниз, что первоначальные изменения Object во время выполнения, поэтому мы можем сразу же получить данные. Вторая причина, по которой он вызывается, - это только когда происходят изменения в «<» (однонаправленная привязка данных) и «@» (для оцениваемых значений атрибута DOM), которые связаны с родительским компонентом. Как только вызывается $onChanges, вы получите специальные изменения Object back, с которыми вы можете подключиться, которые мы рассмотрим в следующих разделах.

Основная практическая разница $onInit будет вызываться только на директивы инициализации, но $onChanges будет вызываться во время инициализации и когда < и @ переменные изменения.