gpt4 book ai didi

javascript - 带有angularjs的动态菜单栏

转载 作者:行者123 更新时间:2023-11-30 08:49:10 25 4
gpt4 key购买 nike

我正在尝试使用 Angularjs 创建一个菜单栏。我以前用 Backbonejs 做过类​​似的事情,但我很难理解如何用 angular 来做到这一点。

在我的 html 文件中,我有以下菜单占位符。

<div id='menu1'></div>
<div id='menu2'></div>
<div id='menu3'></div>
<div id='menu4'></div>
<div id='menu5'></div>

我的许多 Angular 模块在加载时(在 run 中)添加了一个菜单。他们每个人只保留一个特定的位置(即 menu1..5),所以他们不会冲突。当某些模块未加载时,它们的菜单不会显示在菜单栏中。

Angular 模块在概念上看起来像:

angular.module('myModule3', [])
.service('someService', function($http) {
// get some data to populate menu (use $http)
this.menuItems = ['orange', 'apple', 'banana']
})

.run(['someService', function(someService) {
// create a rendered menu item
...
// insert it at id="menu3"
})

为简单起见,呈现的菜单项应如下所示:

  <ul>
<li>organge</li>
<li>apple</li>
<li>banana</li>
</ul>

我对 Angular 还很陌生,所以我真的不知道从哪里开始。我一直在阅读有关 directive 的内容,但看不到它们如何适合这里,因为它们需要一些自定义标记(可能是包含 DOM 目标的自定义菜单标签(即 menu ..5)。此外,我不清楚如何将其连接到 Controller 。

更新除了上面的 base template(包含 DOM 中的任意 anchor )和指令(将生成一个将插入到这些 anchor 的 DOM 元素)之外,模板将有助于创建DOM 元素。该模板将位于一个单独的文件中,该文件包含指令的 DOM 元素将插入到的位置(与指令的通常情况相反,在指令中,已经存在的标记将被替换/插入到与指令定义匹配的特定标记中:

<menu ng-model="Model3DataService" target="#menu3">
<ul>
<li ng-repeat="for item in items"></li>
</ul>
</menu>

同样,从 Backbone/jquery 背景来看这是有道理的,但这可能不是 angular 的正确做法。如果是这样,请告诉我如何让基本模板不了解模块的任何知识以及他们放置菜单的位置(即他们分配的菜单栏的哪个插槽)。我很高兴听到其他解决方案...

最佳答案

每个模块都应该定义其菜单加载器:

angular.module('module1', []).

factory('module1.menuLoader', function() {
return function(callback) {
callback(['oranges', 'bananas'])
}
});

您的应用程序应该包含 menu 指令,它可以仅在任何模块存在时加载菜单项。

angular.module('app', ['module1']).

directive('menu', ['$injector', function($injector) {
return {
restrict: 'A',
template:
'<ul><li ng-repeat="item in items">{{item}}</li></ul>',
scope: {},
link: function($scope, $element, $attrs) {
var menuLoaderName = $attrs.menu+'.menuLoader';
if ($injector.has(menuLoaderName)) {
var loaderFn = $injector.get(menuLoaderName);
loaderFn(function(menuItems) {
$scope.items = menuItems;
});
}
}
};
}]);

最终 html:

<div class="content">
<div menu="module1"></div>
<div menu="module2"></div>
<div menu="module3"></div>
</div>

运行应用程序后,只会加载 module1 菜单。其他菜单占位符保持为空。

现场演示:http://plnkr.co/edit/4tZQGSkJToGCirQ1cmb6


更新:如果您想在模块端生成标记,最好的方法是将模板放入定义它的模块中的 $templateCache,然后将模板名称传递给应用程序。

angular.module('module1', []).

factory('module1.menuLoader', ['$templateCache', function($templateCache) {
$templateCache.put('module1Menu', '<ul><li ng-repeat="item in items">{{item}}</li></ul>');
return function(callback) {
callback('module1Menu', ['oranges', 'bananas'])
}
}]);


angular.module('app', ['module1'])

.directive('menu', ['$injector', function($injector) {
return {
restrict: 'A',
template:
'<div ng-include="menuTemplate"></div>',
scope: {},
link: function($scope, $element, $attrs) {
var menuLoaderName = $attrs.menu+'.menuLoader';
if ($injector.has(menuLoaderName)) {
var loaderFn = $injector.get(menuLoaderName);
loaderFn(function(menuTemplate, menuItems) {
$scope.menuTemplate = menuTemplate;
$scope.items = menuItems;
});
}
}
};
}]);

关于javascript - 带有angularjs的动态菜单栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com