2012-07-03 11 views
16

Tengo una página que contiene 2 controladores: uno que administra una lista de las llamadas 'aplicaciones', y otro que es colocar la nueva plantilla angular en el innerHTML de su elemento Div.Cargar plantilla AngularJS dentro de la página, dinámicamente

<div ng-controller="appList"></div> 
<div ng-controller="appPane"> Dynamic content should be loaded here! </div> 

He intentado usar los estándares {{expresión}} atascamientos, pero no trabajar con html, también he probado el ng-bind-html-insegura Directiva (Enlazar el innerHTML al de la App devolución de la solicitud), pero los controladores no se ejecutan dentro de este nuevo código.

El problema parece ser que al usar una vinculación, Angular no vuelve a analizar el contenido del html en cuestión para utilizarlo como una aplicación angular. ¿Alguna idea de cómo lograr analizar contenido dinámico?

+1

¿Las aplicaciones angulares distintas de las "aplicaciones" (cada una tiene una declaración 'ng-app'?) O solo diferentes controladores/vistas para la misma aplicación? Si solo hay diferentes controladores/vista, usaría la lista de aplicaciones como navegación y configuración '$ routeProviders' (http://docs.angularjs.org/api/ng.$routeProvider) para administrar las diferentes vistas. –

+0

Probablemente una solución mejor que la que estaba intentando, pero todavía soy nuevo en Angular, así que lo probaré. Gracias. – Zoey

Respuesta

4

Tome una mirada en el módulo de uiRouter (del proyecto AngularUI). Agrega el concepto de estados, que son bastante similares a las rutas, pero con otras ventajas, como la capacidad de anidarlas. Por ejemplo:

$stateProvider 
    .state('myState', { 
     url: '/mystate', 
     templateUrl: '...', 
     controller: 'MyCtrl' 
    }) 
    .state('myState.substate', { 
     url: '/{substate}', 
     templateUrl: '...', 
     controller: 'MySubCtrl' 
    }); 

MySubCtrl se activará cada vez que vaya a /mystate/something y puede utilizar ese "algo" como un parámetro (ver $stateParams). Puede anidar estados en cualquier cantidad de niveles.

+0

¡Eso suena realmente útil! Siendo que mi respuesta fue del desarrollo temprano de Angular, esto no había existido. Otros pueden comentar si este no es el caso, pero siento que esta es la respuesta correcta. Aceptado. – Zoey

+1

Estoy feliz de que estas cosas (el ecosistema AngularJS) estén evolucionando como están. –

+0

Para el registro, he probado esta solución en mis propios proyectos y es extremadamente útil. Hay algunos problemas, como la navegación a rutas inexistentes que generan errores, pero estoy seguro de que oculto en su documentación de profundidad moderada es un medio de detectar cuándo una ruta no existe de manera tal que pueda manejarse. Como escenario general, recomiendo esta solución a cualquiera que intente utilizar rutas, y recomiendo omitir el proveedor oficial de rutas de Angular, ya que este es mucho más poderoso. – Zoey

25

Parece que el servicio $ compile, cuando se alimenta con los elementos que desea recompilar junto con su alcance actual, hace lo que estaba buscando.

Ejemplo de mi fuente:

var appPane = $('#AppPane');//JQuery request for the app pane element. 
appPane.html(data);//The dynamically loaded data 
$compile(appPane.contents())($scope);//Tells Angular to recompile the contents of the app pane. 

Esto debería ayudar a cualquier persona que experimenta mi problema, espero.

6

Mire $routes y ngView en angularjs.

Aquí hay un ejemplo muy básico:

http://jsfiddle.net/pXpja/3/

+0

Esta es la alternativa 'oficial', pero actualmente no funciona en situaciones que requieren una estructura en capas de controladores como en mi problema original. – Zoey

Cuestiones relacionadas