ตามคำแนะนำของพาเวลที่จะใช้คำสั่งที่กำหนดเองนี่เป็นรุ่นที่ต้องเพิ่มไม่มีน้ำหนักบรรทุกไป 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" จะจับคู่กับ "# / home" ในhref
ใน หากคุณมีแท็บที่ควรตอบสนองต่อระดับที่สองหรือที่สามหรือที่ 11 ของเส้นทางให้ปรับตามนั้น การแบ่งส่วนนี้จาก 1 หรือมากกว่านั้นจะข้าม '#' สามานย์ใน href ซึ่งจะอยู่ที่ดัชนี 0
ข้อกำหนดเพียงอย่างเดียวคือคุณเรียกใช้<a>
เนื่องจากองค์ประกอบถือว่าการมีอยู่ของhref
คุณลักษณะซึ่งจะเปรียบเทียบกับเส้นทางปัจจุบัน อย่างไรก็ตามคุณสามารถปรับเปลี่ยนได้อย่างง่ายดายในการอ่าน / เขียนองค์ประกอบหลักหรือองค์ประกอบย่อยหากคุณต้องการเรียกใช้<li>
บางสิ่งบางอย่าง ฉันขุดเพราะคุณสามารถนำมันกลับมาใช้ในบริบทจำนวนมากโดยเพียงแค่การแตกต่างกันอาร์กิวเมนต์ระดับ path หากความลึกในการอ่านถูกสมมติขึ้นในตรรกะคุณจะต้องมีคำสั่งหลายเวอร์ชันเพื่อใช้กับการนำทางหลายส่วน
แก้ไข 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>
โปรดทราบว่ารุ่นนี้จะไม่คล้ายกับสไตล์ Bootstrap HTML จากระยะไกลอีกต่อไป แต่มันทันสมัยกว่าและใช้องค์ประกอบน้อยลงดังนั้นฉันจึงเป็นส่วนหนึ่งของมัน คำสั่งเวอร์ชันนี้รวมถึงต้นฉบับมีวางจำหน่ายแล้วบน Githubเป็นโมดูลดรอปอินที่คุณสามารถประกาศได้ว่าเป็นการพึ่งพา ฉันยินดีที่ Bower-ize พวกเขาหากใครใช้จริง
นอกจากนี้หากคุณต้องการเวอร์ชั่นที่เข้ากันได้กับ bootstrap <li>
คุณสามารถไปกับโม ดูแท็บ angular-ui-bootstrapซึ่งฉันคิดว่าออกมาหลังจากโพสต์ต้นฉบับนี้และอาจจะมีการเปิดเผยมากกว่านี้ มันกระชับน้อยกว่าสำหรับเนื้อหาพื้นฐาน แต่มีตัวเลือกเพิ่มเติมให้คุณเช่นแท็บที่ปิดใช้งานและเหตุการณ์ที่ประกาศซึ่งจะเปิดใช้งานและปิดใช้งาน