Theo lời khuyên của Pavel để sử dụng chỉ thị tùy chỉnh, đây là phiên bản không yêu cầu thêm tải trọng vào tuyếnConfig, siêu khai báo và có thể được điều chỉnh để phản ứng với bất kỳ cấp nào của đường dẫn, chỉ cần thay đổi mức độ nào slice()
bạn đang chú ý .
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");
}
});
}
};
});
Chúng tôi đang hoàn thành mục tiêu của mình bằng cách lắng nghe $routeChangeSuccess
sự kiện, thay vì đặt một $watch
con đường. Tôi lao động theo niềm tin rằng điều này có nghĩa là logic nên chạy ít thường xuyên hơn, vì tôi nghĩ rằng đồng hồ bắn vào mỗi $digest
chu kỳ.
Gọi nó bằng cách chuyển đối số cấp đường dẫn của bạn trên khai báo lệnh. Điều này xác định đoạn nào của $ location.path () hiện tại mà bạn muốn khớp với href
thuộc tính của mình .
<li class="nav_tab"><a href="#/home" detect-active-tab="1">HOME</a></li>
Vì vậy, nếu các tab của bạn sẽ phản ứng với mức cơ sở của đường dẫn, hãy tạo đối số '1'. Do đó, khi location.path () là "/ home", nó sẽ khớp với "# / home" trong href
. Nếu bạn có các tab sẽ phản ứng với cấp độ thứ hai hoặc thứ ba hoặc thứ 11 của đường dẫn, hãy điều chỉnh cho phù hợp. Việc cắt lát này từ 1 trở lên sẽ bỏ qua '#' bất chính trong href, sẽ sống ở chỉ số 0.
Yêu cầu duy nhất là bạn gọi vào một <a>
, vì phần tử đang giả sử sự hiện diện của một href
thuộc tính, nó sẽ so sánh với đường dẫn hiện tại. Tuy nhiên, bạn có thể thích ứng khá dễ dàng để đọc / ghi phần tử cha hoặc con, nếu bạn muốn gọi trên <li>
hoặc một cái gì đó. Tôi khai thác điều này bởi vì bạn có thể sử dụng lại nó trong nhiều ngữ cảnh bằng cách thay đổi đối số pathLevel. Nếu độ sâu để đọc từ được giả định trong logic, bạn cần nhiều phiên bản của lệnh để sử dụng với nhiều phần của điều hướng.
EDIT 3/18/14: Giải pháp được khái quát hóa không đầy đủ và sẽ kích hoạt nếu bạn xác định một đối số cho giá trị của 'activeTab' trả về undefined
cả hai $location.path()
và phần tử href
. Bởi vì : undefined === undefined
. Cập nhật để khắc phục tình trạng đó.
Khi làm việc trên đó, tôi nhận ra rằng đã có một phiên bản mà bạn có thể khai báo trên phần tử cha, với cấu trúc mẫu như thế này:
<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>
Lưu ý rằng phiên bản này không còn giống với HTML kiểu Bootstrap nữa. Nhưng, nó hiện đại hơn và sử dụng ít yếu tố hơn, vì vậy tôi là một phần của nó. Phiên bản chỉ thị này, cộng với bản gốc, hiện có sẵn trên Github dưới dạng mô-đun thả xuống, bạn chỉ có thể khai báo là phụ thuộc. Tôi rất vui khi Bower-ize cho họ, nếu có ai thực sự sử dụng chúng.
Ngoài ra, nếu bạn muốn có một phiên bản tương thích bootstrap bao gồm <li>
, bạn có thể sử dụng mô-đun Tab angular-ui-bootstrap , mà tôi nghĩ đã xuất hiện sau bài đăng gốc này, và có lẽ còn mang tính khai báo hơn cả bài này. Nó ít súc tích hơn cho các công cụ cơ bản, nhưng cung cấp cho bạn một số tùy chọn bổ sung, như các tab bị vô hiệu hóa và các sự kiện khai báo kích hoạt kích hoạt và hủy kích hoạt.