route page navigationend example change angularjs angularjs-directive angularjs-compile

angularjs - page - navigationend angular 4



$ Compilar angular con controlador requerido (3)

Acabo de tener un problema similar, y la solución parece ser primero agregar el elemento al elemento principal y luego compilarlo.

.directive(''item'', function($compile) { return { template:''<li><a ng-click="addSubList()">Create Another List</a></li>'', require: ''^parent'', replace: true, link: function(scope, element, attrs, parentCtrl) { scope.addSubList = function() { var sublist = angular.element(''<ul list>''); element.find(''a'').append(sublist); $compile(sublist)(scope); }; } }; });

Ver este Plunker: http://plnkr.co/edit/dASASrFbtXSMCRZKRAj5?p=preview

Tengo una directiva de lista compuesta, es decir, un elemento de lista que puede ser una lista por sí mismo.
La directiva principal define el controlador:

.directive(''parent'', function() { controller: function($scope) { }, link: function (scope, element, attrs) { } })

La lista (de elementos) requiere el controlador principal, que por sí solo funciona bien (¿por qué no debería?):

.directive(''list'', function() { require: ''^parent'', link: function (scope, element, attrs, parentCtrl) { } })

Lo mismo ocurre con el elemento concreto, que también está bien:

.directive(''item'', function() { require: ''^parent'', link: function (scope, element, attrs, parentCtrl) { } })

Un elemento puede ser un compuesto, en cuyo caso se crea una "lista". Esta composición se realiza mediante $ compilar (ing) un elemento de lista dentro de la función de enlace:

link: function (scope, element, attrs, parentCtrl) { ... $compile("<list></list>")(scope) ... }

Lo que arroja una excepción:
El controlador ''padre'', requerido por la directiva ''lista'', no se puede encontrar!

El motivo es obvio: la función $ compile no proporcionó el controlador y, por lo tanto, el requisito de "padre" no se puede resolver.
Y así he intentado proporcionar el controlador manualmente:

$compile("<list></list>")(scope, null, {''parent'': parentCtrl});

Lo que no produce una excepción pero aún no proporciona este controlador cuando es necesario.

¿Alguna idea de cómo hacer que la función $ compile acepte un controlador externo que también debería evaluarse?


Para futuras referencias, aquí está la solución:

En la función $ compile, el controlador requerido se puede pasar como el controlador transcluido:

$compile(template)(scope, undefined, {transcludeControllers: injectedCtrl})

Donde "injectedCtrl" es el objeto que enumera los controladores que espera la directiva, por ejemplo, si require: ''^dad'' , entonces transcludeControllers verá así:

transcludeControllers: { dad: { //name of controller in ''require'' statement instance: vm //instance of controller } }

Vea este ejemplo: https://jsfiddle.net/qq4gqn6t/11/


¡Eso es!


$compile(angular.element("< list>< /list >"))(scope)