大佬教程收集整理的这篇文章主要介绍了如何使用AngularJS + Angular UI Router制作自动动态面包屑,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我确实自己解决了一段时间,因为没有可用的东西。我决定不使用该data
对象,因为我们实际上不希望面包屑标题由孩子继承。有时会有模态对话框和右侧面板滑入,从技术上讲是“儿童视图”,但它们不应影响面包屑。通过使用breadcrumb
对象,我们可以避免自动继承。
对于实际title
属性,我正在使用$interpolate
。我们可以将面包屑数据与解析范围合并,而不必在其他地方进行解析。在我遇到的所有情况下,我都只想使用resolve作用域,因此效果很好。
我的解决方案也可以处理i18n。
$stateProvIDer
.state('courses', {
url: '/courses',
template: Templates.vIEwsContainer(),
controller: function(Translation) {
Translation.load('courses');
},
breadcrumb: {
title: 'COURSEs.title'
}
})
.state('courses.List', {
url: "/List",
templateUrl: 'app/courses/courses.List.HTML',
resolve: {
coursesData: function(Model) {
return Model.getAll('/courses');
}
},
controller: 'CoursesController'
})
// this child is just a slIDe-out vIEw to add/edit the SELEcted course.
// It should not add to the breadcrumb - it's technically the same screen.
.state('courses.List.edit', {
url: "/:coursEID/edit",
templateUrl: 'app/courses/courses.List.edit.HTML',
resolve: {
course: function(Model, $stateParams) {
return Model.getone("/courses", $stateParams.coursEID);
}
},
controller: 'CourseFormController'
})
// this is a brand new screen, so it should change the breadcrumb
.state('courses.detail', {
url: '/:coursEID',
templateUrl: 'app/courses/courses.detail.HTML',
controller: 'CourseDetailController',
resolve: {
course: function(Model, $stateParams) {
return Model.getone('/courses', $stateParams.coursEID);
}
},
breadcrumb: {
title: '{{Course.namE}}'
}
})
// lots more screens.
我不想将面包屑绑定到指令,因为我认为在我的应用程序中可能有多种方式直观显示面包屑。因此,我将其投入了服务:
.factory("Breadcrumbs", function($state, $translate, $interpolatE) {
var List = [], title;
function getProperty(object, path) {
function index(obj, i) {
return obj[i];
}
return path.split('.').reduce(index, object);
}
function addBreadcrumb(title, statE) {
List.push({
title: title,
state: state
});
}
function generateBreadcrumbs(statE) {
if(angular.isdefined(state.parent)) {
generateBreadcrumbs(state.parent);
}
if(angular.isdefined(state.breadcrumb)) {
if(angular.isdefined(state.breadcrumb.titlE)) {
addBreadcrumb($interpolate(state.breadcrumb.titlE)(state.locals.globals), state.Name);
}
}
}
function appendtitle(translation, indeX) {
var title = translation;
if(index < List.length - 1) {
title += ' > ';
}
return title;
}
function generatetitle() {
title = '';
angular.forEach(List, function(breadcrumb, indeX) {
$translate(breadcrumb.titlE).then(
function(translation) {
title += appendtitle(translation, indeX);
}, function(translation) {
title += appendtitle(translation, indeX);
}
);
});
}
return {
generate: function() {
List = [];
generateBreadcrumbs($state.$current);
generatetitle();
},
title: function() {
return title;
},
List: function() {
return List;
}
};
})
实际的面包屑指令变得非常简单:
.directive("breadcrumbs", function() {
return {
reStrict: 'E',
replace: true,
priority: 100,
templateUrl: 'common/directives/breadcrumbs/breadcrumbs.HTML'
};
});
和模板:
<h2 translate-cloak>
<ul class="breadcrumbs">
<li ng-repeat="breadcrumb in Breadcrumbs.List()">
<a ng-if="breadcrumb.state && !$last" ui-sref="{{Breadcrumb.statE}}">{{Breadcrumb.title | translatE}}</a>
<span class="active" ng-show="$last">{{Breadcrumb.title | translatE}}</span>
<span ng-hIDe="$last" class="divIDer"></span>
</li>
</ul>
</h2>
从此处的屏幕截图中,您可以看到它在两种导航中均能完美运行:
以及HTML <title>
标签:
PS到Angular UI Team:请立即添加类似的内容!
Web应用程序的一个关键组件是面包屑/导航。使用Angular UI
Router,将面包屑元数据放在各个状态中而不是放在控制器中是有意义的。手动为需要的每个控制器创建面包屑对象是一项直截了当的任务,但这也是一个非常麻烦的任务。
我已经看到了一些使用Angular的自动面包屑的解决方案,但是老实说,它们相当原始。某些状态,例如对话框或侧面板,不应更新面包屑,但是如果将当前的附加组件添加到angular,则无法表达这种状态。
另一个问题是面包屑的标题不是静态的。例如,如果转到“用户详细信息”页面,则面包屑标题可能应该是用户的全名,而不是通用的“用户详细信息”。
需要解决的最后一个问题是为父链接使用所有正确的状态参数值。例如,如果您正在查看公司的“用户详细信息”页面,显然您会想知道上级国家需要:CompanyId
。
是否有其他插件可以提供这种水平的面包屑支持?如果不是,最好的解决方法是什么?我不想弄乱我的控制器-我将有很多控制器-我想使它尽可能自动化和轻松。
谢谢!
以上是大佬教程为你收集整理的如何使用AngularJS + Angular UI Router制作自动动态面包屑全部内容,希望文章能够帮你解决如何使用AngularJS + Angular UI Router制作自动动态面包屑所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。