Обновление AngularJS (с 1.5 до 1.6, 1.7) Делает привязки области действия директивы неопределенными.

У меня есть следующий код:

angular
  .module('myApp')
  .directive('layout', function () {
      return {
          restrict: 'E',
          template: '<div ng-include="layoutCtrl.pageLayout"></div>',
          controller: 'LayoutController',
          controllerAs: 'layoutCtrl',
          bindToController: true,
          scope: {
              pageLayout: '=',
              pageConfiguration: '=',
              isPreview: '='
          }
      };
  });

angular
  .module('myApp')
  .controller('LayoutController', LayoutController);

function LayoutController($scope, LayoutDTO, LayoutPreviewDTO) {
    var self = this;
    self.layoutDTO = LayoutDTO;
    self.layoutPreviewDTO = LayoutPreviewDTO;
    var test = $scope;

    if(self.isPreview)
        self.layoutModel = new self.layoutPreviewDTO(self.pageConfiguration);
    else
        self.layoutModel = new self.layoutDTO(self.pageConfiguration);
}


<div>
    <layout page-layout="ctrl.layoutTemplateUrl" page-configuration="ctrl.pageConfiguration" is-preview="false"></layout>
</div>

В версии angular 1.5.3 это работало, как и ожидалось, переменные в моем контроллере поступали со значениями. Теперь, когда я обновился до 1.6.x, self.pageConfiguration теперь не определен.

Ничего не изменилось, кроме угловой версии.

Как мне получить дескриптор значений, переданных в директиву в моем контроллере?


person drabbitharv    schedule 23.02.2017    source источник
comment
Вы проверяли журнал изменений Angular на наличие критических изменений, которые могут привести к тому, что этот код не будет работать? А что именно не работает - какую ошибку выдает? Вы также обновили другие ng нативные модули до той же версии angular?   -  person Alon Eitan    schedule 24.02.2017
comment
self.pageConfiguration теперь не определено вместо значений, которые я передал из html ‹layout page-layout=ctrl.model.layoutTemplateUrl page-configuration=ctrl.model.pageConfiguration is-preview=false›/layout›   -  person drabbitharv    schedule 24.02.2017
comment
К сожалению, это слишком широко. Можете ли вы сделать скрипку, которая воспроизводит проблему? Потому что трудно отлаживать, не зная, как вы вызываете эту директиву и т. Д.   -  person Alon Eitan    schedule 24.02.2017
comment
Под тегами вопроса есть ссылка edit. Нажмите на нее и обновите ответ.   -  person Alon Eitan    schedule 24.02.2017


Ответы (2)


Команда AngularJS рекомендует переместить код контроллера, зависящий от привязок области, в функцию $onInit.

function LayoutController($scope, LayoutDTO, LayoutPreviewDTO) {
    var self = this;
    this.$onInit = function () {
        // bindings will always be available here
        // regardless of the value of `preAssignBindingsEnabled`.
        self.layoutDTO = LayoutDTO;
        self.layoutPreviewDTO = LayoutPreviewDTO;
        var test = $scope;

        if(self.isPreview)
            self.layoutModel = new self.layoutPreviewDTO(self.pageConfiguration);
        else
            self.layoutModel = new self.layoutDTO(self.pageConfiguration);
    };
}

$компилировать:

Из-за bcd0d4 предварительное назначение привязок для экземпляров контроллера по умолчанию отключено. Его все еще можно включить обратно, что должно помочь во время миграции. Предварительное назначение привязок устарело и будет удалено в будущей версии, поэтому мы настоятельно рекомендуем как можно скорее перенести ваши приложения, чтобы не полагаться на него.

Логика инициализации, основанная на наличии привязок, должна быть помещена в метод $onInit() контроллера, который всегда будет вызываться после назначения привязок.

-- Руководство разработчика AngularJS. Переход с версии 1.5 на v1.6 - $компилировать


ОБНОВИТЬ

Флаг $compileProvider.preAssignBindingsEnabled был удален из AngularJS V1.7.

Команда AngularJS настоятельно рекомендует как можно скорее перенести ваши приложения, чтобы не полагаться на него. 1 июля 2018 года прекращается поддержка AngularJS версии 1.6.

Из документов:

Из-за 38f8c9 привязки директив больше не доступны в конструкторе.

Ранее поддерживался флаг $compileProvider.preAssignBindingsEnabled. Флаг определяет, доступны ли привязки внутри конструктора контроллера или только в хуке $onInit. Привязки больше не доступны в конструкторе.

Чтобы перенести код:

  • Если вы указали $compileProvider.preAssignBindingsEnabled(true), вам нужно сначала перенести свой код, чтобы флаг можно было перевернуть на false. Инструкции о том, как это сделать, доступны в " Руководство по переходу с 1,5 дюймов на 1,6 дюйма. После этого удалите оператор $compileProvider.preAssignBindingsEnabled(true).

— Руководство разработчика AngularJS — Переход на версию 1.7 — Компиляция

Примечание:

1 июля 2018 года прекращается поддержка AngularJS 1.6. Для получения дополнительной информации см. AngularJS MISC — статус поддержки версий.

person georgeawg    schedule 24.02.2017
comment
Хорошо, я учту это в будущих версиях, спасибо, что указали мне на эту статью. - person drabbitharv; 24.02.2017
comment
@drabbitharv, вы должны отметить это как правильный ответ. - person Paul N; 08.02.2018