码迷,mamicode.com
首页 > Web开发 > 详细

再谈 angularjs directive 指令

时间:2015-05-22 20:59:48      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

之前写过一篇了 http://www.cnblogs.com/keatkeat/p/3903673.html

但某些部分写的不太清楚,甚至有点错误,所以今天特地在这里再来谈谈。

这篇主要是说指令的隔离还有和controller的沟通.

 

指令的运行过程基本上我们可以简单的理解为 : template -> compile -> controller -> pre-link -> post-link 

我们通常只是用到post link,但如果你的指令有嵌套,子层需要父层的一些值的话,可以考虑把这些初始值写在 controller 或者是 pre-link 

pre-link 是上层到下层调用, post-link 则相反下至上调用. 

 

在开发中当一个内容经常重复时,我们就会把它封装成指令。

这种组件的思想可以节省很多开发时间。

而封装的指令不太可能每一次使用都是一模一样的。

所以我们必须可以调整它。

一般上我们使用 attr.  (就好象函数和参数的感念)

<div ng-controller="ctrl">
    <dir data-param="10"></dir>
</div>
<script>
    var app = angular.module("app", []);
    app.directive("dir", [function () {
        return {
            restrict: "E",              
            link: function (scope, elem, attr) {
                log(attr.param);
            }
        }
    }]);
    app.controller("ctrl", ["$scope", function ($scope) {

    }]);
</script>

通过 attr 我们可以传入一些字符串,attr 只能传入单纯的字符串哦,不可以放属性哦

<dir data-param="someAttr"></dir> 这样是错的

<dir data-param="{{ someAttr }}"></dir> 这样是对的

有一种情况是这样,我们传入属性名,而在link函数中,我们使用 $parse(attr)(scope) 来获取到值,这是不太理想的做法,因为只能在没有隔离scope的情况下才能运行。

是否使用隔离scope, 我个人没有特别想法,只要你小心用就好了。

我个人比较喜欢用隔离的.

隔离 scope 的 "=","@","&" 的区别

隔离scope会把attr的值放入到指令的scope里头

当我们要传入一个attr时,先想清楚指令是否会对这个attr值做修改。

如果是不会那么请使用 @, 会的话用 "="

"@"的情况下,attr 传入的是字符串 

<dir data-param="{{ someAttr }}"></dir> 如果想传属性

<dir data-param="string"></dir> 单纯传值

"="的情况,attr 传入的是属性名 

<dir data-param="someAttr"></dir>

记住一样要是属性名,因为"="代表双向同步,里面可能改变外面,所以外面必须要有一个属性来装这个值,如果没有的话是会报错的哦!所以你一样要搞清楚这逻辑!

& 是用来传方法的。

<div ng-controller="ctrl">
    <dir data-some-method="someMethod($event,someParam,insideScope)"></dir> <!--这里必须表明清楚param的名字-->
</div>
<script>
    var app = angular.module("app", []);
    app.directive("dir", [function () {
        return {
            restrict: "E",
            template: ‘<div ng-click="someMethod({ $event : $event, someParam : data, insideScope : this })">click</div>‘,
            link: function (scope, elem, attr) {
                scope.data = "100";
                scope.someMethod({ $event: "z", someParam: "gg" }); //调用是传入属性
            },
            scope: {
                someMethod: "&"
            }
        }
    }]);
    app.controller("ctrl", ["$scope", function ($scope) {
        $scope.someMethod = function ($event, someParam, insideScope) {
       //这里的 this = $scope
       //如果你想操作指令内的scope,可以通过param传进来 log($event); log(someParam);
//100 } }]); </script>

这里有点不明白的地方是,为什么必须定义好param的名字和数量呢? 

如果不要使用 & , "=" 也是可以完成这个工作,"="  可以传方法,但是 "@"不行哦 (不太理解)

 

如果指令内部是复杂的,那么你可能需要通过 $watch attr 来render 你的view 

如果外部会修改你的 attr 值,而你的template 无法满足修改后的渲染的话。 

 

再谈 angularjs directive 指令

标签:

原文地址:http://www.cnblogs.com/keatkeat/p/4523171.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!