Pavel'in özel bir yönerge kullanma tavsiyesine uyarak, burada routeConfig'e yük eklemeyi gerektirmeyen, süper bildirime dayalı ve yalnızca hangisine slice()
dikkat ettiğinizi değiştirerek yolun herhangi bir düzeyine tepki verecek şekilde uyarlanabilen bir sürüm var . .
app.directive('detectActiveTab', function ($location) {
return {
link: function postLink(scope, element, attrs) {
scope.$on("$routeChangeSuccess", function (event, current, previous) {
var pathLevel = attrs.detectActiveTab || 1,
pathToCheck = $location.path().split('/')[pathLevel] ||
"current $location.path doesn't reach this level",
tabLink = attrs.href.split('/')[pathLevel] ||
"href doesn't include this level";
if (pathToCheck === tabLink) {
element.addClass("active");
}
else {
element.removeClass("active");
}
});
}
};
});
Hedeflerimize , yola $routeChangeSuccess
bir tane yerleştirmek yerine olayı dinleyerek $watch
ulaşıyoruz. Sanırım her $digest
döngüde ateşi izlediğim için bunun mantığın daha az çalışması gerektiği inancıyla çalışıyorum .
Yönerge bildiriminde yol düzeyi argümanınızı ileterek onu çağırın. Bu, href
özniteliğinizle eşleştirmek istediğiniz geçerli $ location.path () yığınını belirtir .
<li class="nav_tab"><a href="#/home" detect-active-tab="1">HOME</a></li>
Dolayısıyla, sekmelerinizin yolun temel seviyesine tepki vermesi gerekiyorsa, '1' argümanını yapın. Böylece location.path () "/ home" olduğunda, içindeki "# / home" ile eşleşecektir href
. Yolun ikinci seviyesine veya üçüncü veya 11'ine tepki vermesi gereken sekmeleriniz varsa, buna göre ayarlayın. Bu 1 veya daha büyük dilimleme, dizin 0'da yaşayacak olan href içindeki kötü '#' işaretini atlayacaktır.
Tek gereksinim, <a>
eleman href
mevcut yolla karşılaştıracağı bir özniteliğin varlığını varsaydığı için bir üzerinde çağırmanızdır . Bununla birlikte, <li>
ya da başka bir şeyi çağırmayı tercih ettiyseniz, bir ebeveyn ya da çocuk unsuru okumak / yazmak için oldukça kolay uyum sağlayabilirsiniz . Bunu kazıyorum çünkü basitçe pathLevel argümanını değiştirerek onu birçok bağlamda yeniden kullanabilirsiniz. Mantıkta okunacak derinlik varsayılmışsa, gezinmenin birden çok bölümüyle kullanmak için yönergenin birden çok sürümüne ihtiyacınız olacaktır.
DÜZENLEME 18/3/14: Çözüm yetersiz bir şekilde genelleştirildi ve undefined
her ikisine $location.path()
ve öğelerine karşı dönen 'activeTab' değeri için bir bağımsız değişken tanımladıysanız etkinleşirdi href
. Çünkü: undefined === undefined
. Bu durumu düzeltmek için güncellendi.
Bunun üzerinde çalışırken, bunun gibi bir şablon yapısına sahip bir üst öğe üzerinde tanımlayabileceğiniz bir sürüm olması gerektiğini fark ettim:
<nav id="header_tabs" find-active-tab="1">
<a href="#/home" class="nav_tab">HOME</a>
<a href="#/finance" class="nav_tab">Finance</a>
<a href="#/hr" class="nav_tab">Human Resources</a>
<a href="#/quarterly" class="nav_tab">Quarterly</a>
</nav>
Bu sürümün artık uzaktan Bootstrap tarzı HTML'ye benzemediğini unutmayın. Ancak, daha modern ve daha az öğe kullanıyor, bu yüzden ben de buna düşkünüm. Yönergenin bu sürümü ve orijinali artık Github'da bir bağımlılık olarak bildirebileceğiniz bir açılır modül olarak mevcuttur. Herhangi biri gerçekten kullanıyorsa, onları Bower-ize etmekten mutlu olurum.
Ayrıca, <li>
's içeren önyükleme uyumlu bir sürüm istiyorsanız, bu orijinal gönderiden sonra çıktığını düşündüğüm ve belki de bundan daha açıklayıcı olan angular-ui-bootstrap Tabs modülünü tercih edebilirsiniz . Temel şeyler için daha az özlüdür, ancak size devre dışı bırakılan sekmeler ve etkinleştirildiğinde ve devre dışı bırakıldığında tetiklenen bildirim olayları gibi bazı ek seçenekler sunar.