사용자 정의 지시어를 사용하는 파벨의 조언에 따라, 여기의 routeConfig에 더 페이로드를 추가하는 필요로하지 않는다 버전의 슈퍼 선언하고, 단순히 어떤 변경하여 경로의 모든 수준에 반응하도록 할 수 있습니다 slice()
당신이주의를 지불하고 그것의 .
app.directive('detectActiveTab', function ($location) {
return {
link: function postLink(scope, element, attrs) {
scope.$on("$routeChangeSuccess", function (event, current, previous) {
/*
Designed for full re-usability at any path, any level, by using
data from attrs. Declare like this:
<li class="nav_tab">
<a href="#/home" detect-active-tab="1">HOME</a>
</li>
*/
// This var grabs the tab-level off the attribute, or defaults to 1
var pathLevel = attrs.detectActiveTab || 1,
// This var finds what the path is at the level specified
pathToCheck = $location.path().split('/')[pathLevel] ||
"current $location.path doesn't reach this level",
// This var finds grabs the same level of the href attribute
tabLink = attrs.href.split('/')[pathLevel] ||
"href doesn't include this level";
// Above, we use the logical 'or' operator to provide a default value
// in cases where 'undefined' would otherwise be returned.
// This prevents cases where undefined===undefined,
// possibly causing multiple tabs to be 'active'.
// now compare the two:
if (pathToCheck === tabLink) {
element.addClass("active");
}
else {
element.removeClass("active");
}
});
}
};
});
우리는 진로를 $routeChangeSuccess
놓기보다는 이벤트 를 경청하여 목표를 달성하고 $watch
있습니다. 나는 이것이 각 $digest
사이클 마다 시계가 발사되는 것으로 생각하기 때문에 로직이 덜 자주 실행되어야한다는 것을 믿는다 .
지시문 선언에 경로 수준 인수를 전달하여 호출하십시오. 이것은 현재 $ location.path ()의 청크를 href
속성과 일치시킬 것을 지정합니다 .
<li class="nav_tab"><a href="#/home" detect-active-tab="1">HOME</a></li>
따라서 탭이 경로의 기본 수준에 반응해야하는 경우 인수 '1'을 만드십시오. 따라서 location.path ()가 "/ home"인 경우 location.path ()가 "# / home"과 일치합니다.href
. 경로의 두 번째 레벨 또는 세 번째 또는 11 번째에 반응해야하는 탭이있는 경우 그에 따라 조정하십시오. 1 이상의 슬라이싱은 href 0에서 악의적 인 '#'을 무시하고 인덱스 0에 있습니다.
<a>
요소가 href
현재 경로와 비교할 속성 의 존재를 가정하고 있기 때문에 유일한 요구 사항은에 대해 호출 하는 것입니다. 그러나 <li>
또는 무언가 를 호출하는 것을 선호하는 경우 부모 또는 자식 요소를 읽거나 쓰는 데 상당히 쉽게 적응할 수 있습니다 . 단순히 pathLevel 인수를 변경하여 여러 컨텍스트에서 재사용 할 수 있기 때문에 이것을 파헤칩니다. 읽을 깊이가 논리에서 가정 된 경우 탐색의 여러 부분에 사용할 여러 버전의 지시문이 필요합니다.
편집 3/18/14 : 솔루션이 잘못 일반화되었으며 반환 된 'activeTab'값에 대한 인수를 정의하면 활성화됩니다 undefined
으며 $location.path()
, 및 요소의 에 대해href
. 왜냐하면 : undefined === undefined
. 해당 조건을 수정하도록 업데이트되었습니다.
그 작업을하는 동안 다음과 같은 템플릿 구조로 부모 요소에 선언 할 수있는 버전이 있어야한다는 것을 깨달았습니다.
<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>
이 버전은 더 이상 원격으로 부트 스트랩 스타일 HTML과 유사하지 않습니다. 그러나 더 현대적이고 더 적은 수의 요소를 사용하므로 부분적으로 사용합니다. 이 버전의 지시문과 원본은 이제 Github 에서 드롭 인 모듈로 사용할 수 있으며 종속성으로 선언 할 수 있습니다. 누군가가 실제로 사용한다면 Bower-ize에 기뻐할 것입니다.
또한의 부트 스트랩 호환 버전을 원한다면 angular-ui-bootstrap Tabs 모듈<li>
을 사용할 수 있습니다 .angular-ui-bootstrap 탭 모듈 은 원래 게시물 이후에 나온 것으로 생각되며 아마도이 게시물보다 훨씬 선언적입니다. 기본 사항은 덜 간결하지만 비활성화 된 탭 및 활성화 및 비활성화시 발생하는 선언적 이벤트와 같은 몇 가지 추가 옵션을 제공합니다.