Работа с не готовыми привязками в Angluarjs

В моем компоненте я передаю объект как привязку,

.component('selectionButton', {
    bindings: {
        parentForm : '<'
    },
    templateUrl: 'selection-button-component.html',
    controller: 'selectionButtonController',
    controllerAs: 'selBtnCtrl'
});

Проблема в том, что объект, который я передаю, еще не загружен, когда мой компонент инициализирован, поэтому в хуке $onChanges я сделал это:

vm.$onChanges = function(newObj){
    if(angular.isDefined(newObj.parentForm.currentValue)){
        vm.parentForm = newObj.parentForm.currentValue;
    }
};

В моем контроллере я вызываю vm.parentForm в функции, которую я запускаю, когда я нажимаю кнопку после того, как моя страница полностью загружена, но я всегда получаю ее как undefined, даже когда я изменил ее значение, используя $onChanges.

Когда я проверил функцию vm.$onChanges, я увидел, что значение vm.parentForm получает новое значение в changesObj.parentForm.

Как я могу это решить?

Редактировать :

Я попытался обернуть свой элемент ng-if следующим образом:

<span ng-if="fullPage.posteForm">
            <selection-button parent-form="fullPage.posteForm" ></selection-button>
        </span>

но это не сработало. Я также пробовал двустороннюю привязку, которая также не работала.


person Renaud is Not Bill Gates    schedule 25.08.2017    source источник
comment
два возможных решения. 1. изменить привязки на =. 2. иметь ng-if=vm.parentForm для переноса html, и поэтому после его инициализации html будет перекомпилирован.   -  person Charlie Ng    schedule 25.08.2017
comment
вам вообще не нужен ng-if, чтобы решить эту проблему: используйте onChanges внутри вашего дочернего компонента, поэтому каждый раз, когда ваше значение будет обновляться, хук onChanges будет запускаться внутри дочернего компонента, и поэтому вы можете назначить новое значение объекта. onChanges() = function(changes) { if (changes.parentForm.currentValue !== undefined) { this.parentForm = changes.parentForm.currentValue; }   -  person rbinsztock    schedule 28.08.2017
comment
На самом деле вам не нужно обновлять локальную область компонента, поскольку он автоматически обновляется при любых изменениях привязки.   -  person korteee    schedule 28.08.2017
comment
Можете ли вы поделиться остальной частью кода вашего контроллера? Возможно, проблема вовсе не в обвязке.   -  person JC Ford    schedule 28.08.2017
comment
make fiddle/plunk - все, что у вас есть, просто работает   -  person Petr Averyanov    schedule 29.08.2017


Ответы (1)


Когда вы передаете объект компоненту, он может быть не готов, потому что вы ожидаете разрешения обещания или другого действия, но определение объекта присутствует как неопределенное. Для такого рода сценариев вы можете использовать isFirstChange(). Вот рабочий пример, иллюстрирующий такой случай пример JSFiddle. Откройте консоль, чтобы увидеть, когда ваши привязки будут обновлены после тайм-аута.

Примечание: если имя объекта, используемое в шаблоне компонента, равно имени, переданному компоненту, вам не нужно создавать новый объект, оно будет обновлено в вашем компоненте и доступно в шаблоне.

person aUXcoder    schedule 30.08.2017