发表于: 2017-05-12 22:51:17

1 840


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

了解AngularJS指令


明天计划的事情:(一定要写非常细致的内容) 

了解自定义指令如何在项目发挥作用

了解列表的翻页问题,和搜索过滤

遇到的问题:(遇到什么困难,怎么解决的) 


如何去自定义一个指令:自定义指令是angular中比较有难度的一个知识点,自定义指令能让代码更加简化,复用性更好。

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<body ng-app="myApp">
<test-directive></test-directive>
<script>
var app = angular.module("myApp", []);
app.directive("testDirective", function() {
return {
template : "<h1>这是一个自定义指令</h1>"
};
});
</script>
</body>
</html>



收获:(通过今天的学习,学到了什么知识)

AngularJS允许使用“指令”的新属性扩展HTML。 


AngularJS具有一组内置指令,可为您的应用程序提供功能。

angularjs中内置了很多指令(Directive),常用的如ng-repeat、ng-class等等,我们也可以自己定义指令,而且在项目中是非常普遍的。

我们经常进行很多DOM操作,如点击事件,表单验证事件等等,angular不建议我们将这些操作放在控制层,也即Contrller处,而是应该在指令处进行DOM的操作。也算是为了减轻控制层的负担吧。

AngularJS自定义指令。

定义指令

angular.module("myApp", []).directive(name, fn)
name (string) 指令的名称
fn (function) 该函数返回指令的全部行为
当然,我们也可以往函数中注入各种服务,关于服务的定义可参考此文
请看示例:

angular.module("myApp", []).
directive(name, function($http, $timeout, YOUR_SERVICE){
 // 指令的行为
})


定义指令的行为

指令的行为可以是非常简单,也可以非常复杂,官方给了我们很多配置项,实际使用时只能具体问题具体分析了。

指令的行为最终会返回一个object对象,对象以键值对的方式定义,如下所示:



angular.module('myApp', [])
.directive('myDirective', function() {
 return {
   restrict: String,
   priority: Number,
   terminal: Boolean,
   template: String or Template Function:
     function(tElement, tAttrs) (...},
   templateUrl: String,
   replace: Boolean or String,
   scope: Boolean or Object,
   transclude: Boolean,
   controller: String or
   function(scope, element, attrs, transclude,  otherInjectables) { ... }, controllerAs: String,
   require: String,
   link: function(scope, iElement, iAttrs) { ... },
   compile: // 返回一个对象或连接函数,如下所示:
     function(tElement, tAttrs, transclude) {
       return {
         pre: function(scope, iElement, iAttrs, controller) { ... },
         post: function(scope, iElement, iAttrs, controller) { ... }
       }
       // 或者
       return function postLink(...) { ... }
    }
 };
});


看起来复杂,实际使用指令的时候只会使用到一部分。

restrict (字符串)

该属性定义了属性在视图上的使用方式,默认值是A。备选值有:

A:即Attribute,以属性的方式定义

E:即Element,以元素的方式定义

C:即Class,以类的方式定义

M:即Comment,以注释的方式定义

参见实例:

angular.module("myApp", [])
.directive("myDirecitve", function(){
 return {
   restrict: 'AECM'
 }
})

// 视图上使用属性的方式
<div my-direcitve></div>

// 视图上使用元素的方式
<my-direcitve></my-direcitve>

// 视图上使用类的方式
<div class="my-direcitve"></div>

// 视图上使用注释的方式
<!--directive:my-direcitve -->

一般情况下,我们会用AE,类和注释还是比较少用的,尤其是注释,一般不推荐使用。类的话是为了避免和我们定义样式时产生歧义。

注意点可以看到我们定义指令时是用驼峰定义法定义指令的名称的,但是视图上使用是却用了-,这是因为HTML是不区分大小写的,因此angular则规定了视图上使用-分隔两个单词。


Angular.js 自定义 指令 如果指定了controller和link函数,link函数和指定controller里面的的scope是同一个scope,所以也就不需要实时同步之说。

如果在angular之外的事件中改变值,需要调用scope.$apply() 或者

$timeout(function(){

    //修改 scope的值 

})




 


返回列表 返回列表
评论

    分享到