2012-07-03 15 views
16

Mam stronę zawierającą 2 kontrolery: jedną, która zarządza listą tak zwanych "aplikacji", a drugą, która umieszcza nowy szablon kątowy w innerHTML elementu Div.Załaduj szablon AngularJS na stronie dynamicznie

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

Próbowałem przy użyciu standardowych {{wyrażenie}} powiązania, ale nie działają z html, ja też próbowałem NG-bind-html-niebezpieczne dyrektywy (Binding innerHTML porównywalny z App żądanie powrotu), ale kontrolery nie są wykonywane w ramach tego nowego kodu.

Problem polega na tym, że stosując wiązanie, Angular nie przerabia zawartości danego html, aby użyć go jako aplikacji kątowej. Jakieś pomysły, jak zdobyć je do analizy zawartości dynamicznej?

+1

Czy aplikacje są odrębnymi aplikacjami kątowymi (każda z nich ma deklarację 'ng-app'?) Lub tylko różnymi kontrolerami/widokami dla tej samej aplikacji? Jeśli istnieją tylko różne kontrolery/widok, użyłbym appList jako nawigacji i konfiguracji '$ routeProviders' (http://docs.angularjs.org/api/ng.$routeProvider) do zarządzania różnymi widokami. –

+0

Prawdopodobnie lepsze rozwiązanie niż to, które próbowałem, ale nadal jestem nowy w Angular, więc spróbuję go. Dzięki. – Zoey

Odpowiedz

4

Spójrz na module uiRouter (od projektu AngularUI). Dodaje pojęcie stanów, które są bardzo podobne do tras, ale z innymi dodatkami, takimi jak możliwość ich zagnieżdżania. Na przykład:

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

MySubCtrl zostanie aktywowany, gdy idziesz do /mystate/something i można go używać to „coś” jako parametr (patrz $stateParams). Możesz zagnieździć stany do dowolnej ilości poziomów.

+0

Brzmi naprawdę przydatne! Ponieważ moja odpowiedź pochodziła z wczesnego rozwoju Angular, to nie istniało. Inni mogą komentować, jeśli tak nie jest, ale uważam, że teraz jest to właściwa odpowiedź. Przyjęty. – Zoey

+1

Cieszę się, że te rzeczy (ekosystem AngularJS) ewoluują tak, jak są. –

+0

Dla przypomnienia, wypróbowałem to rozwiązanie w moich własnych projektach i jest ono niezwykle przydatne. Istnieje kilka problemów, takich jak nawigacja czy nieistniejące trasy, które prowadzą do błędów, ale zakładam, że ukryta w ich umiarkowanej dokumentacji dokumentacja jest sposobem na wykrycie, kiedy trasa nie istnieje, tak aby można było nią manipulować. W ogólnym scenariuszu polecam to rozwiązanie każdemu, kto próbuje korzystać z tras, i polecam omijanie oficjalnego dostawcy trasy z Angular, ponieważ ten jest o wiele potężniejszy. – Zoey

25

Wygląda na to, że usługa $ compile, po wprowadzeniu elementów, które chcesz przekompilować wraz z bieżącym zasięgiem, robi to, czego szukałem.

Przykład z mojego źródła:

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. 

To powinno pomóc ktoś przeżywa mój problem, mam nadzieję.

6

Spójrz na $routes i ngView w angularjs.

Oto bardzo prosty przykład:

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

+0

To jest "oficjalna" alternatywa, ale obecnie nie działa w sytuacjach wymagających warstwowej struktury kontrolerów, jak w moim pierwotnym problemie. – Zoey

Powiązane problemy