Actualización de AngularJS(1.5 a 1.6,1.7) Hace que los enlaces de alcance de directiva no estén definidos
angular-directive angular-controller (2)
El equipo de AngularJS recomienda que el código del controlador que depende de los enlaces de ámbito se mueva a una función
$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);
};
}
$ compilar:
Debido a bcd0d4 , la asignación previa de enlaces en instancias de controlador está deshabilitada de forma predeterminada. Todavía es posible volver a encenderlo, lo que debería ayudar durante la migración. La asignación previa de enlaces ha quedado en desuso y se eliminará en una versión futura, por lo que recomendamos encarecidamente migrar sus aplicaciones para no confiar en ella lo antes posible.
La lógica de inicialización que se basa en los enlaces presentes debe colocarse en el método
$onInit()
del controlador, que se garantiza que siempre se llamará después de que se hayan asignado los enlaces.- Guía del desarrollador de AngularJS - Migración de v1.5 a v1.6 - $ compile
ACTUALIZAR
El
$compileProvider.preAssignBindingsEnabled
se ha eliminado de AngularJS V1.7.
El equipo de AngularJS recomienda encarecidamente migrar sus aplicaciones para no confiar en ellas lo antes posible. AngularJS V1.6 finaliza el 1 de julio de 2018.
De los documentos:
Debido a 38f8c9 , los enlaces de directivas ya no están disponibles en el constructor.
Anteriormente, el
$compileProvider.preAssignBindingsEnabled
era compatible. El indicador controlaba si los enlaces estaban disponibles dentro del constructor del controlador o solo en el$onInit
. Los enlaces ya no están disponibles en el constructor.Para migrar su código:
- Si especificó
$compileProvider.preAssignBindingsEnabled(true)
, primero debe migrar su código para que el indicador se pueda voltear afalse
. Las instrucciones sobre cómo hacerlo están disponibles en la guía "Migración de 1.5 a 1.6" . Luego, elimine la$compileProvider.preAssignBindingsEnabled(true)
.- Guía del desarrollador de AngularJS - Migrar a V1.7 - Compilar
Nota:
El 1 de julio de 2018, finaliza el soporte para AngularJS 1.6. Para obtener más información, consulte AngularJS MISC - Estado de soporte de versión .
Tengo el siguiente 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>
En la versión angular 1.5.3 esto funcionó como se esperaba, las variables en mi controlador estaban llegando con valores. Ahora, desde que actualicé a 1.6.x, self.pageConfiguration ahora no está definido.
Nada ha cambiado excepto la versión angular.
¿Cómo obtengo un control de los valores pasados a la directiva en mi controlador?
Me lo imaginé:
https://github.com/angular/angular.js/commit/dfb8cf6402678206132e5bc603764d21e0f986ef
Este valor predeterminado es falso ahora, debe establecerse en verdadero $ compileProvider.preAssignBindingsEnabled (verdadero);