توجيه AngularJS لإنشاء جدول محتويات
-
21-12-2019 - |
سؤال
تخيل نص HTML يحتوي على عناوين (h1-h6).في حالتي، فهو موجود أيضًا على شكل DOM في صفحة html.لذلك باستخدام jQuery سأفعل شيئًا مثل $('.text').find('h1,h2,h3,h4,h5,h6')
لاستخراج جميع العناوين.
لكنني لا أرغب في استخدام jQuery أو أي إطار عمل ثقيل آخر.كيف يمكنني القيام بذلك مع angularJS؟يرجى تذكر أنني بحاجة إلى العناوين بالترتيب الصحيح لعرضها كجدول محتويات.
المحلول
إذن هذا هو الحل النهائي.يُستخدم الجزء ng-model لتحديث العناوين الرئيسية عند تحديث النص.
.directive('tableOfContents', function(){
return {
restrict:'A',
require:'?ngModel',
link : function(scope, elm, attrs,ngModel) {
function updateHeadlines() {
scope.headlines=[];
angular.forEach(elm[0].querySelectorAll('h1,h2,h3,h4,h5,h6'), function(e){
scope.headlines.push({
level: e.tagName[1],
label: angular.element(e).text(),
element: e
});
});
}
// avoid memoryleaks from dom references
scope.$on('$destroy',function(){
scope.headlines=[];
});
// scroll to one of the headlines
scope.scrollTo=function(headline){
headline.element.scrollIntoView();
}
// when the html updates whe update the headlines
ngModel.$render = updateHeadlines;
updateHeadlines();
}
}
})
الاستخدام:
<a ng-repeat="headline in headlines" ng-click="scrollTo(headline)">{{headline.label}}</a>
<div table-of-contents ng-model="html">{{html}}</div>
نصائح أخرى
أنت محظوظ ويجب أن تكون قادرًا على الاستخدام angular.element تقريبًا بنفس الطريقة التي تستخدم بها jQuery.
angular.element('h1')
سوف نجد h1
عناصر.
يمكنك العثور على العناصر التي تحتوي على الفئة ".text" باستخدام
angular.element(document.querySelectorAll(".text"));
لا تنتمي إلى StackOverflow