2017-01-30 2 views
-2

Я имею угловую 1.5 компоненты внутри HTML-странице (не родительский компонент) и компонент не будет вызывать $ onChanges при изменении: здесь являются содержащим HTML: , . .

<my-comp standards-data="standardsData"></my-comp> 

. . .

здесь компонент:

angular.module("bla").component('myComp', { 
    templateUrl: '/my-comp.tpl.html', 
    controller: myController, 
    bindings: { 
     standardsData: '<' 
    } 
}); 

function myController() { 
    var self = this; 

    self.$onInit = function() { 
     self.standardsData = {}; 
    } 

    self.$onChanges = function (changes) { 
     self.standardsData.something = changes.standardsData.currentValue.something; 
    }; 
} 

Когда я получать новые данные в Ctrl в HTML, который содержит мой компонент, он не будет влиять на компонент. Я получаю только в $ onInit компонента и после изменения $ scope.standardsData (в содержащем html/ctrl), $ OnChanges моего компонента не будет вызываться.

Надеюсь, я описал проблему правильно, Спасибо!

ответ

2

Связывание вашего компонента с standardsData является привязкой к ссылке на объект, которая не изменяется даже при изменении одного из ее свойств. В результате $onChanges не запускается. Это связано с тем, что $onChanges использует мелкие $watch.

Другими словами, $onChanges срабатывает только если мы будем использовать примитивы (т.е. не объекты) или изменить ссылку из объектов JavaScript, связанного в компонент

Итак, вам нужно либо: 1) Привяжите вручную свойства, которые вы хотите, а не ссылку на объект, или 2) Измените весь объект standardsData при изменении его данных. Вы также можете 3) Переписать $onChanges функциональность, я полагаю (не рекомендуется).

Вариант 1: Привязка только к свойству

Используйте если родительский контроллер/компонент просто изменяет свойство или свойства.

<my-comp standards-data-something="standardsData.something"></my-comp> 

и

bindings: { 
    standardsDataSomething: '<' 
} 

Вариант 2: Изменение опорного

Используйте если родительский контроллер/компонент получает совершенно новый standardsData. Вы сохраните свой текущий HTML для этой опции и установите:

standardsData = {newData}; //Reset the new data from http or wherever 

, чтобы изменить ссылку.


Некоторые дальнейшего чтения вы можете найти интересные:

http://blog.kwintenp.com/the-onchanges-lifecycle-hook/

http://www.codelord.net/2016/12/20/replacing-angulars-deep-watches-with-the-%24docheck-lifecycle-hook/

+0

Спасибо за ваш ответ! На самом деле я не думаю, что это потому, что standardData - это объект. В приложении есть 2 случая: 1. Мы нажимаем на какую-либо ссылку и маршрутизируем на этот экран. При этом в событии onChanges нет активности. (только onInit) ... 2. В этот момент, когда я обновляю страницу (например, F5), событие onChanges начинает действовать. любая идея? Спасибо! – moshi

+0

@moshi - Две вещи вызывают '$ onChanges': 1) Когда компонент сначала инициализируется, 2) когда происходят изменения в привязке родителем. Обновление F5 заставляет вас видеть активность изменений от инициализации. Вы никогда не увидите его снова, потому что вы привязаны к ссылке на объект, которая не изменяется. Я удалю свой (правильный) ответ, если хотите. – sh0ber

+0

Благодарим вас за ответ. Я согласен с вами в том, что $ onChanges возникает при инициализации. Я не вижу, что это всегда происходит при изменении данных. Это как когда я обновляю страницу и нажимаю пункты меню (каждый из которых загружает новые данные для этого компонента) - каждый все идет хорошо. Для каждого клика - $ onChanges. НО - когда я перехожу на другую страницу и нажимаю там по ссылке на мою страницу (страница, содержащая компонент), мой компонент $ onChanges не срабатывает, хотя я обновляю данные. Тогда, вне зависимости от того, что я хочу сделать в любом меню, он не будет вызывать $ onChanges на моем компоненте. – moshi

Смежные вопросы