2012-08-16 14 views
5

Używam zakładki jquery UI w angularJS i użyłem ng-repeat do wygenerowania elementów list i kontenerów tabulacji. Karty działają, ale kontenery tabulacji nie działają poprawnie.Karta Jquery UI nie działa w AngularJS

template - tabs.html

<ul ng-sortable="pages"> 
    <li ng-controller="pageCtrl" ng-repeat="page in pages"> 
     <a class="pageName" href="#{{page.id}}">{{page.name}}</a> 
    </li> 
</ul> 
<div id="{{page.id}}" ng-repeat="page in pages"> 
    <p>{{page.id}}</p> 
</div> 

dyrektywa

.directive('ngTabs', function($rootScope) { 
     return { 
      restrict: 'E', 
      templateUrl: "js/templates/tabs.html", 
      link: function(scope, elm) { 
       elm.tabs(); 
      } 
     }; 
    }) 

jsfiddle Link: http://jsfiddle.net/sannitesh/NLw6y/

+0

Rozwiązałeś to? Mam ten sam problem. – thomas

+0

Jestem zdezorientowany przez Fiddle. Co nie działa poprawnie z JSFiddle? –

Odpowiedz

1

Problem polega na tym, że gdy dyrektywa ngTabs wykonywana jest treść, która div nie jest jeszcze wygenerowany. Zawijanie wywołania do .tabs() w metodzie setTimeout wystarczy.

myApp.directive('ngTabs', function() { 
    return function(scope, elm) { 
     setTimeout(function() { 
      elm.tabs(); 
     },0); 
    }; 
}); 

patrz jsFiddle. To może nie być najlepszy/kątowy sposób.

Możesz zajrzeć do usługi compile, szczególnie jeśli rzeczywiste zakładki zmieniają się w czasie wykonywania.

+0

Czy nie powinien korzystać z usługi $ timeOut? – uriDium

+0

@uriDium Jeśli chce wywołać $ scope. $ Apply then yes, ale jeśli jest to efekt wyłącznie wizualny, to nie ma potrzeby, dyrektywa nie modyfikuje danych zakresu, więc nie ma nic do zastosowania –

+0

Po prostu pomyślałem, że $ timeout był gwarantowane wykonanie poza fazami skrótów lub faz aplikacji i natychmiast po zakończeniu bieżącej fazy. Po prostu pomyślałem, że to bezpieczniejsze. – uriDium