如何使用angularjs处理动态菜单

如何使用angularjs处理动态菜单,第1张

angularjs处理动态菜单的实现方法:

1、核心angularjs代码:

var testImg=angular.module("appTest",["ms.leafMenu"])

.controller('testCtr',['$scope',function($scope){

$scope.data=[{"id":"1","pid":"0","name":"第一行","children":[{"id":"3","pid":"1","name":"第一行1.1"},{"id":"4","pid":"1","name":"第一行1.2"}]},{"id":"2","pid":"0","name":"第二行","children":[{"id":"5","pid":"2","name":"第二行2.1"}]}]

}])

angular.module("ms.leafMenu",[])

.directive('msLeafMenu',['$compile',function($compile){

return {

restrict:'EA',

transclude: true,

replace: false,

//template:"<li></li>",

scope:{

data:'=?',

id:'@?',

pid:'@?',

pvalue:'@?',

showname:'@?',

isstandard:'@?'

},

link:function(scope,element,attrs,leafController){

创建节点数据的方法:

function createTreeData(id,pid,pvalue){

var newData=[]

angular.forEach(scope.data,function(item,index){

if(item[pid]==pvalue){

var children=createTreeData(id,pid,item[id])

if(children &&children.length>0){

item.children=children

}

newData.push(item)

}

})

return newData

}

if(!scope.isstandard){

scope.data=createTreeData(scope.id,scope.pid,scope.pvalue)

}

//向节点增加数据

element.append($compile('<ul class="ms_leaf_menu_group"><li ng-repeat="row in data" ng-class="{ms_parent_item:(row.children &&row.children.length>0),ms_child_item:(!row.children || row.children.length<=0)}"><div ng-click="toogle($index)"><a >{{row[showname]}}</a><span class="glyphicon" ng-class="{\'glyphicon-chevron-right\':(row.children &&row.children.length>0 &&!row.isopen),\'glyphicon-chevron-down\':(row.children &&row.children.length>0 && row.isopen)}"  aria-hidden="true"></span></div><div ng-show="row.isopen"><ms-leaf-menu data="row.children" id="id" pid="pid" showname="{{showname}}" pvalue="{{row[id]}}"></ms-leaf-menu></div></li></ul>')(scope))

//此处是关键,调用入口处,需要找到index

scope.toogle=function(index){

scope.data[index]["isopen"]=!scope.data[index]["isopen"]

}

}

}

}])

</script>

2、html代码:

<body ng-app="appTest">

<div ng-controller="testCtr" style=" width:200pxmargin-left:automargin-right:auto">

    <ms-leaf-menu data="data" id="id" pid="pid" showname="name" pvalue="0"></ms-leaf-menu>

   </div>

</body>

3、效果图

如何利用AngularJS服务接入外部API

除了对HTML进行扩展的能力之外,AngularJS还提供一套简便途径、帮助我们与外部API实现交互。利用其服务与GitHub的API相对接,进而创建一套简单的库浏览器。

现在用这套基础HTML模板为起点

一、准备工作

现在将AngularJS脚本添加到该文档的<head>当中:

在此之后,可以在将这套CCS样式添加到行内或者独立的文件当中:

其中不存在任何多余的内容、只保留最基础的布局方案——将搜索栏置于右侧、库信息位于中央、用户库同样置于右侧。还需要将对应代码行打包至<pre>标签当中,此后还要利用它显示README文件内容——因为这些内容通常来自GitHub Flavored Markdown、而且其中一部分代码行与用户库列表存在重叠。

可以向其中添加更多样式以提升成果的视觉效果——但以上截图都采取最基本的外观设计。

在未来需要编写的JavaScript代码置于本文档的<head>当中或者为其建立独立文件,但独立文件仍然需要处于AngularJS脚本之下

二、模块

现在可以为自己的应用程序创建一个模块:

接下来利用ngApp指令将其添加到<body>标签当中:

三、控制器

需要为自己的应用程序准备一套控制器。为了简化创建流程,将只为应用准备一套控制器,这样就不必考虑如何在不同控制器之间进行信息传递了

四、基础服务

需要对自己的GitHub服务进行定义:

将使用app.factory()方法,这样就能保证返回对象附带几个以后将会用到的方法。将使用$http服务从GitHub的API中获取数据。

五、搜索库

服务中的第一项方法负责利用GitHub API对库进行搜索。使用服务非常简单(这项函数能够进入由制造函数返回的对象):

$http.get()方法是执行GET请求的一种捷径。第一条参数是希望访问的URL。第二条参数则代表一个具备选项的对象。这里只需要params对象——它是一个查询参数散列,将被添加到该请求当中(其中q参数属于搜索字符串)。

$http.get()会返回一项承诺。可以将监听器附加在success()与error()上,并且据此调用回调函数。

六、搜索栏

为了使用之前几步中定义完成的函数,需要在自己的HTML当中添加搜索栏。相关代码非常简单,如下所示:

使用ngModel指令将该输入栏中的值指向至Scope query变量,并在用户按下回车键后利用ngKeyup调用executeSearch()函数(这样$event.keyCode == 13就会进行比较)。无法在AngularJS表达式中使用条件语句,但一条简单的逻辑运算符(AND)足以很好地完成这项任务。

在输入域下面,使用ngRepeat来显示搜索结果。将显示该库的完整名称与描述(如果需要显示其它不同内容,可以点击此处查看GitHub API说明文档中的可用域)。

还使用ngClick通过该库的完整名称来调用openRepo()函数,这样就能显示与之相关的信息,稍后再对该函数进行定义。

七、使用搜索功能

现在可以使用自己创建完成的服务了。首先,将GitHub参数添加至控制器函数(这样该服务就能被注入到AngularJS当中):

现在定义executeSearch()函数:

利用来自$scope.query的搜索字符串从当中调用GitHub.searchRepos(),而后在回调中将搜索结果(来自data.items)加入$scope.repos变量。

只要执行以上步骤,就能顺利显示出搜索结果。在浏览器中打开HTML文件并尝试进行搜索:

八、获取库中的数据

被传递至此函数的名称必须为完整名称(结构为:作者名称、斜杠、库名称——例如angular/angular.js),这是因为需要将其传递至GitHub API。

九、获取库中的README文件

README文件中的内容并未被包含在我利用以上函数获取到的数据当中。相反,需要利用另一个API进行调用及获取,因此需要创建以下函数:

这条函数与之前我们创建完毕的两条基本相同,只不过对URL进行了变更。还要利用atob()函数解码README文件的内容,因为它采用base64编码机制。可以点击此处查看GitHub API说明文档中与获取README文件内容相关的信息。

之所以没有将这两条请求塞进同一个函数当中,是因为某些库根本不具备 README文件。如果将二者强行结合,应用程序可能因此发生故障。

十、显示库信息

将在另一个元素<div>当中显示库的完整名称、查看过该库的人数以及README文件:

将把该信息保存在控制器Scope内的activeRepo变量当中。只要存在可以显示的数据,ngShow就会将该元素显示出来(如果不存在可以显示的数据,将只能看到‘Watched by people’文本,而且没有任何库被选中)。

十一、更新控制器

还需要对控制器进行更新,从而保证其切实获取到库数据并将其纳入Scope当中。下面创建之前附加至ngClick指令的openRepo()函数:

在这里,首先使用GitHub.getRepo()方法、检查错误而后将该数据引入activeRepo变量。接下来,获取README文件——如果该文件不存在,需要向用户提示该情况。

现在可以再次运行自己的应用程序并查看其实际效果:

十二、获取用户的库

为了将更多功能引入到应用程序当中,将为屏幕右方已被选定库的持有者显示其所有可用库。这要求向服务中引入另一个方法:

十三、显示用户的库

这基本上相当于重现HTML中的搜索栏机制,不过实际需要显示的是用户名称与user对象中的库,而非输入域或者Scope本身:

到了这一步,应该已经拥有了一套能够切实运作的AngularJS应用程序——它可以根据搜索字符串获取GitHub库。

一、安装 eslint-plugin-angular

1、安装eslint

1)全局安装

2)局部安装

3)eslint初始化

2、检查eslint 是否安装成功

1)此时会生成.eslintrc.js文件,且内容如下(根据初始化时的选择会有差异):

2)运行eslint 命令(--fix 命令可自动修复常见问题)

此时命令行工具会出现错误提示

3、添加eslint-plugin-angular插件

1)运行如下命令

2)修改.eslintrc.js文件

3)再次执行eslint命令,可在命令行查看警告

参考网址:

1)http://eslint.cn/

2)https://github.com/Gillespie59/eslint-plugin-angular

3)https://github.com/johnpapa/angular-styleguide/tree/master/a1


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11358874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存