前面练习了如何自定义指令,这里练习一下指令在不同的控制器中如何复用。

  —— 来自《慕课网 指令3》

  首先看一下一个小例子,通过自定义指令,捕获鼠标事件,并触发控制器中的方法。

  单个控制器的标签指令

  依然是先创建一个模块

var myAppModule = angular.module("myApp",[]);

  在模块的基础上,创建控制器和指令

            myAppModule.controller("myAppCtrl",["$scope",function($scope){
$scope.count = 0;
$scope.loadData = function(){
$scope.count = $scope.count+1;
console.log("myAppCtrl load data!"+$scope.count);
}
}]); myAppModule.directive("loader",function(){
return{
restrict:"AE",
transclude:true,
template:"<div><div ng-transclude></div></div>",
link:function(scope,element,attr){
element.bind("mouseenter",function(){
// scope.loadData();
scope.$apply("loadData()");
});
}
}
});

  首先看一下创建的控制器,在其中创建了一个loadData方法,用于相应触发事件,为了便于观察结果,添加了一个计数器。

  下面的指令采用了属性和标签元素的使用方式:“AE”,为了得到效果,创建了一个内嵌的模板(避免没有内容时,点击不到)。

  并在link属性的方法内,添加相应事件,方法中有三个参数:

  1 scope,作用域,用于调用相应的作用域的方法。

  2 element,指代创建的标签

  3 attr,用于扩展属性,稍后展示使用方法

  有了以上的准备工作,就可以在body里面使用标签了:

<div ng-controller="myAppCtrl">
<loader howToLoad="loadData()">第一个loader!</loader>
</div>

  

  如何复用指令

  以上仅仅是单个控制器的指令使用,一个指令在一个页面中可以被多次使用,也就意味着,会有多个控制器使用该指令。

  那么指令如何知道调用控制器的那个方法呢?这就用到了attr属性。

  在创建指令时,调用attr获取属性的值

myAppModule.directive("loader",function(){
return{
restrict:"AE",
transclude:true,
template:"<div><div ng-transclude></div></div>",
link:function(scope,element,attr){
element.bind("mouseenter",function(){
// scope.loadData();
// scope.$apply("loadData()");
scope.$apply(attr.howtoload);
});
}
}
});

  就可以在body中按照如下的方式使用了:

        <div ng-controller="myAppCtrl">
<loader howToLoad="loadData()">第一个loader!</loader>
</div>
<div ng-controller="myAppCtrl2">
<loader howToLoad="loadData2()">第二个loader!</loader>
</div>

  需要注意的是:

  1 标签中属性使用驼峰法命名,在指令中要转换成全部小写。

  2 指令中调用的仅仅是属性的名字,没有方法括号。

  3 应用时,属性对应的值是该控制器内声明的执行方法。

  

  下面看一下样例代码:

<!doctype html>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://apps.bdimg.com/libs/angular.js/1.2.16/angular.min.js"></script>
</head>
<body> <div ng-controller="myAppCtrl">
<loader howToLoad="loadData()">第一个loader!</loader>
</div>
<div ng-controller="myAppCtrl2">
<loader howToLoad="loadData2()">第二个loader!</loader>
</div>
<script type="text/javascript">
var myAppModule = angular.module("myApp",[]); myAppModule.controller("myAppCtrl",["$scope",function($scope){
$scope.count = 0;
$scope.loadData = function(){
$scope.count = $scope.count+1;
console.log("myAppCtrl load data!"+$scope.count);
}
}]);
myAppModule.controller("myAppCtrl2",["$scope",function($scope){
$scope.count = 0;
$scope.loadData2 = function(){
$scope.count = $scope.count+1;
console.log("myAppCtrl2 load data!"+$scope.count);
}
}]); myAppModule.directive("loader",function(){
return{
restrict:"AE",
transclude:true,
template:"<div><div ng-transclude></div></div>",
link:function(scope,element,attr){
element.bind("mouseenter",function(){
// scope.loadData();
// scope.$apply("loadData()");
scope.$apply(attr.howtoload);
});
}
}
});
</script>
</body>
</html>

  实现的结果:

【AngularJS】—— 10 指令的复用的更多相关文章

  1. 学习AngularJs:Directive指令用法(完整版)

    这篇文章主要学习AngularJs:Directive指令用法,内容很全面,感兴趣的小伙伴们可以参考一下   本教程使用AngularJs版本:1.5.3 AngularJs GitHub: http ...

  2. AngularJS之指令

    紧接上篇博客“初探AngularJS” 一.前言 在AngularJS中指令尤为重要且内容庞多,固单独提炼出来,梳理一番.如有错误,请不吝讲解. 好了,言归正传,让我们一起走进Angular指令的世界 ...

  3. 带你走近AngularJS - 体验指令实例

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  4. AngularJs自定义指令详解(2) - template

    一些用于定义行为的指令,可能不需要使用template参数. 当指定template参数时,其值可以是一个字符串,表示一段HTML文本,也可以是一个函数,这函数接受两个参数:tElement和tAtt ...

  5. AngularJs自定义指令详解(1) - restrict

    下面所有例子都使用angular-1.3.16.下载地址:http://cdn.bootcss.com/angular.js/1.3.16/angular.min.js 既然AngularJs快要发布 ...

  6. angularJS自定义指令间的“沟通”

    由此例子我们可以看出,angularJS使用指令时link的执行顺序<html> <head> <meta charset="utf-8"/> ...

  7. AngularJS: 自定义指令与控制器数据交互

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 学习AngularJs:Directive指令用法

    跟我学AngularJs:Directive指令用法解读(上) http://blog.csdn.net/evankaka/article/details/51232895 跟我学AngularJs: ...

  9. 《AngularJS》--指令的相互调用

    转载自http://blog.csdn.net/zhoukun1008/article/details/51296692 人们喜欢AngularJS,因为他很有特色,其中他的指令和双向数据绑定很吸引着 ...

随机推荐

  1. xcoj 1208 矩阵

    赛场上一开始以为是递推,交了一发希望以为能卡着线过(毕竟是O(5N)的),结果WA了. 又以为是dp,最后半小时尝试各种YY...各种WA 实际上取每次transfer中最大的概率然后递推是不对的.. ...

  2. hdu3982 直线切多边形 【WA中...】

    题意:有一块蛋糕,上面有一颗cherry.用刀子切n次,求切完之后有cherry的那部分的面积 My solution: 先做一个大矩形,使cake内切于这个大矩形.如图: 然后不断切这个大矩形,每次 ...

  3. Centos7更新firefox

    1.用你本地的旧版 firefox,访问http://www.firefox.com.cn,下载Linux版本的Firefox. 2.进入存放下载文件(Firefox-latest-x86_64.ta ...

  4. HDU 5908 Abelian Period(暴力+想法题)

    传送门 Description Let S be a number string, and occ(S,x) means the times that number x occurs in S. i. ...

  5. Objective 多态

    多态的特点 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了. ...

  6. Linux bash 中,如何将正常信息和错误信息输出到文件

    问题描述: $ command 2>> error $ command 1>> output 是否有方法,在bash同一行,实现输出stderr到error文件,输出stdou ...

  7. [转]h5页面测试总结

    转自http://www.blogjava.net/qileilove/archive/2014/07/24/416154.html?utm_source=tuicool H5页面测试总结 其实经过几 ...

  8. oracle表字段为汉字,依据拼音排序

    在order by后面使用NLSSORT函数转化汉字列,如下 select * from student order by NLSSORT(name,'NLS_SORT=SCHINESE_PINYIN ...

  9. cmake 编译 c++ dll 的一个例子

    CMakeLists.txt project(xxx) add_library(xxx SHARED xxx.cpp) add_executable(yyy yyy.cpp) target_link_ ...

  10. C# vs C++ Performance

    http://www.codeproject.com/Articles/212856/Head-to-head-benchmark-Csharp-vs-NET