learn - AngularJS Upgrade(1.5 to 1.6,1.7) Torna as ligações do escopo da diretiva indefinidas




learn angular (2)

Eu tenho o seguinte código:

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>

Na versão 1.5.3 angular isto funcionou como esperado, as variáveis ​​no meu Controller estavam chegando com valores. Agora, desde que fiz o upgrade para o 1.6.x, o self.pageConfiguration agora está indefinido.

Nada mudou, exceto a versão angular.

Como faço para obter uma alça nos valores passados ​​para a diretiva no meu controlador?


A equipe do AngularJS recomenda que o código do controlador que depende das ligações do escopo seja movido para uma função $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);
    };
}

$ compile:

Devido ao bcd0d4 , a pré-atribuição de ligações nas instâncias do controlador é desativada por padrão. Ainda é possível ativá-lo novamente, o que deve ajudar durante a migração. A pré-atribuição de ligações foi descontinuada e será removida em uma versão futura, por isso recomendamos enfaticamente que você migre seus aplicativos para não depender disso o mais rápido possível.

A lógica de inicialização que depende da presença de ligações deve ser colocada no método $onInit() do controlador, que é garantido que sempre será chamado após as ligações terem sido atribuídas.

- AngularJS Developer Guide - Migrando da v1.5 para a v1.6 - $ compile

ATUALIZAR

O flag $compileProvider.preAssignBindingsEnabled foi removido do AngularJS V1.7.

A equipe do AngularJS recomenda enfaticamente migrar seus aplicativos para não dependerem dele o mais rápido possível. AngularJS V1.6 vai ao fim da vida em 1Julho de 2018.

Do Documentos:

Devido a 38f8c9 , as associações de diretivas não estão mais disponíveis no construtor.

Anteriormente, o $compileProvider.preAssignBindingsEnabled era suportado. O sinalizador controlava se as ligações estavam disponíveis dentro do construtor do controlador ou apenas no gancho $onInit . As ligações agora não estão mais disponíveis no construtor.

Para migrar seu código:

  • Se você especificou $compileProvider.preAssignBindingsEnabled(true) primeiro você precisa migrar seu código para que o sinalizador possa ser invertido para false . As instruções sobre como fazer isso estão disponíveis no guia "Migrando de 1.5 para 1.6" . Depois, remova a $compileProvider.preAssignBindingsEnabled(true) .

- AngularJS Developer Guide - Migrando para a V1.7 - Compilar

Nota:

Em 1 de julho de 2018, o suporte para o AngularJS 1.6 é finalizado. Para mais informações, consulte AngularJS MISC - Version Support Status .








angularjs-1.6