web-dev-qa-db-fra.com

Mise à niveau AngularJS (1.5 à 1.6.1.7) Rend les liaisons de portée de directive non définies

J'ai le code suivant:

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>

Dans la version angular 1.5.3, cela fonctionnait comme prévu, les variables de mon contrôleur arrivaient avec des valeurs. Maintenant, depuis que je suis passé à 1.6.x, self.pageConfiguration n'est plus défini.

Rien n'a changé sauf pour la version angular.

Comment puis-je obtenir une poignée sur les valeurs passées dans la directive dans mon contrôleur?

10
drabbitharv

L'équipe AngularJS recommande que le code du contrôleur qui dépend des liaisons de portée soit déplacé dans une fonction $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:

En raison de bcd0d4 , la pré-affectation des liaisons sur les instances de contrôleur est désactivée par défaut. Il est toujours possible de le réactiver, ce qui devrait aider lors de la migration. La pré-affectation des liaisons a été déconseillée et sera supprimée dans une future version, donc nous vous recommandons fortement de migrer vos applications pour ne pas vous y fier dès que possible.

La logique d'initialisation qui repose sur la présence de liaisons doit être placée dans la méthode $onInit() du contrôleur, qui est garantie d'être toujours appelée après les liaisons ont été affectées.

- AngularJS Developer Guide - Migration de v1.5 vers v1.6 - $ compile


MISE À JOUR

Le drapeau $compileProvider.preAssignBindingsEnabled A été supprimé d'AngularJS V1.7.

L'équipe AngularJS recommande fortement de migrer vos applications pour ne pas y compter le plus tôt possible. AngularJS V1.6 entre en fin de vie le 1er juillet 2018.

Depuis les documents:

En raison de 8f8c9 , les liaisons de directives ne sont plus disponibles dans le constructeur.

Auparavant, l'indicateur $compileProvider.preAssignBindingsEnabled Était pris en charge. L'indicateur contrôlait si les liaisons étaient disponibles dans le constructeur du contrôleur ou uniquement dans le crochet $onInit. Les liaisons ne sont désormais plus disponibles dans le constructeur.

Pour migrer votre code:

  • Si vous avez spécifié $compileProvider.preAssignBindingsEnabled(true), vous devez d'abord migrer votre code afin que l'indicateur puisse être retourné vers false. Les instructions sur la façon de le faire sont disponibles dans le guide "Migration de 1.5 à 1.6" . Ensuite, supprimez l'instruction $compileProvider.preAssignBindingsEnabled(true).

- Guide du développeur AngularJS - Migration vers V1.7 - Compilation

Remarque:

Le 1er juillet 2018, la prise en charge d'AngularJS 1.6 prend fin. Pour plus d'informations, consultez AngularJS MISC - Version Support Status .

15
georgeawg

Je l'ai compris:

https://github.com/angular/angular.js/commit/dfb8cf6402678206132e5bc603764d21e0f986ef

Cette valeur par défaut est false maintenant, doit être définie sur true $ compileProvider.preAssignBindingsEnabled (true);

1
drabbitharv