AngularJS自定义Directive中link和controller的区别

在AngularJS中,自定义Directive过程中,有时用link和controller都能实现相同的功能。那么,两者有什么区别呢?

使用link函数的Directive

页面大致是:

<button id="addItem">Add Item</button>
<without-Controller datasource="customers" add="addCustomer"></without-Controller>

Directive方面:

(function(){
    var withoutController = function(){
        var tempalte = ‘<button id="addItem">Add Item</button><div></div>‘;

        var link = function(scope, element, attrs){

            //从scope中的datasource拿到数据源
            var items = angular.copy(scope.datasource),
            button = angular.element(document.getElementById(‘addItem‘));

            button.on(‘click‘, addItem);

            render();

            function addItem(){
                var name = ‘new customer‘;

                //执行Directive中传入的方法,带参数
                scope.$apply(function(){
                    scope.add()(name);
                });

                items.push({
                    name: name
                });

                render();
            }

            function render(){
                var html = ‘<ul>‘;
                for(var i=0, len=item.length;i<len;i++){
                    html += ‘<li>‘ + items[i].name + ‘</li>‘
                }
                html += ‘</ul>‘;

                element.find(‘div‘).html(html);
            }
        };

        reutrn {
            restrict: ‘EA‘,
            scope: {
                datasource: ‘=‘,
                add: ‘&‘
            },
            link: link,
            template: template
        }
    };

    angular.module(‘directiveModule‘)
        .directive(‘withoutController‘, withoutController);
}());

使用controller的Directive

页面大致是:

<with-controller datasource="customers" add="addCustomer"></with-controller>

Directive方面:

(function(){
    var withController = function(){
        var template = ‘<button ng-click="addItem()">Add Item</button><ul>‘ + ‘<li ng-repeat="item in items">{{::item.name}}</li></ul>‘,

        controller = [‘$scope‘, function($scope){
            init();

            function init(){
                $scope.items = angular.copy($scope.datasource);
            }

            $scope.addItem = function(){
                var name = "customer new";
                $scope.add()(name);
                $scope.items.push({
                    name: name
                });
            }
        }];

        return {
            restrict: ‘EA‘,
            scope: {
                datasource: ‘=‘,
                add:‘&‘
            },
            controller: controller,
            template:template
        }
    };

    angular.module(‘directiveModule‘)
        .direcitve(‘withController‘, withController);
}());

可见,link和controller的相同点在于里面都可包含数据源和操作。不同点在于:link能控制渲染html元素的过程,而controller不能,controller的模版写死的,仅侧重于提供数据源和操作。

如果使用controllerAs,Directive大致是:

(function(){
    var withController = function(){
        var template = ‘<button ng-click="vm.addItem()">Add Item</button><ul>‘ + ‘<li ng-repeat="item in vm.items">{{::item.name}}</li></ul>‘,

        controller = function(){
            var vm = this;

            init();

            function init(){
                vm.items = angular.copy($scope.datasource);
            }

            vm.addItem = function(){
                var name = "customer new";
                vm.add()(name);
                vm.items.push({
                    name: name
                });
            }
        }

        return {
            restrict: ‘EA‘,
            scope: {
                datasource: ‘=‘,
                add:‘&‘
            },
            controller: controller,
            controllerAs: ‘vm‘,
            bindToController:true,
            template:template
        }
    };

    angular.module(‘directiveModule‘)
        .direcitve(‘withController‘, withController);
}());

其中,controllerAs和bindToController属性成对出现。

时间: 2024-11-07 04:29:20

AngularJS自定义Directive中link和controller的区别的相关文章

AngularJs中,如何在父元素中调用子元素为自定义Directive中定义的函数?

最近一段时间准备使用AngularJs中的自定义Directive重构一下代码. 在这里说明一下,把自定义控件封装成Directive并不一定是要复用,而是要让代码结构更加清晰.就好像你将一个长方法拆分成多个独立的小方法,也未必要复用它们一样.职责独立等一票好处,会让后期维护更加轻松. 在重构的过程中,我遇到了这样一个问题,先上图: 图一: 这就是我要重构的界面,由于之前时间紧,将这三个Filter和两个button都写在了一个页面中.当时我已经预感到,如果将这里面的状态都写到一个scope上,

AngularJS自定义Directive与controller的交互

有时候,自定义的Directive中需要调用controller中的方法,即Directive与controller有一定的耦合度. 比如有如下的一个controller: app.controller('MyCtrl',function($scope){ $scope.load = function(){ console.log('loading more...') } }); 现在自定义一个Direcitve,需要调用MyCtrl这个controller中的load方法. app.direc

CSS中link和@import的区别

你对CSS中link和@import的区别是否熟悉,这里和大家分享一下,@import  属性用来指定导入的外部样式表及目标设备类型, link除了调用CSS外还可以有其他作用譬如声明页面链接属性,声明目录,rss等等,而@import就只能 调用CSS. CSS中link和@import有什么区别? 定义  ◆link元素 HTML和XHTML都有一个结构,它使网页作者可以增加于HTML文档相关的额外信息.这些额外资源可以是样式化信息(CSS).导航助手.属于另 外形式的信息(RSS).联系信

AngularJS自定义Directive

什么时候需要自定义Directive? 1. 使你的Html更具语义化,不需要深入研究代码和逻辑即可知道页面的大致逻辑. 2. 抽象一个自定义组件,在其他地方进行重用. 看一下如下2个代码片段: 示例1: 1 <body> 2 <div> 3 <p>This is your class name.</p> 4 <div> 5 <p>Your teacher:</p> 6 <p>Mr. Wang</p>

AngularJS自定义Directive初体验

通常我们这样定义个module并随之定义一个controller. var app = angular.module('myApp', []); app.controller('CustomersController', ['$scope', function($scope){ var counter = 0; $scope.customer = { name:'', street:'' }; $scope.customers = [ { name:'', street:'' }, ... ];

外部引用CSS中 link与@import的区别

差别1:link属于XHTML标签,而@import完全是CSS提供的一种方式. link标签除了可以加载CSS外,还可以做很多其它的事情,比如定义RSS,定义rel连接属性等,@import就只能加载CSS了. 差别2:加载顺序的差别.当一个页面被加载的时候(就是被浏览者浏览的时候),link引用的CSS会同时被加载,而@import引用的CSS会等到页面全部被下载完再被加载. 差别3:兼容性的差别.由于@import是CSS2.1提出的所以老的浏览器不支持,@import只有在IE5以上的才

【转载】Erlang 中 link 和 monitor 的区别

Link and Monitor differences 原文地址 Introduction link/1 and monitor/2 are 2 different ways of notifying (or know) that a process died. Thing is, these are really very different in nature and these differences are not widely understood by beginners. So

angulajs 详解 directive 中 的 scope 概念

Directive 是 angularjs 中最重要的概念,我的理解就是自定义html tag, 这个自定的tag 浏览器不会解析,会有angularjs 来动态解析. 比如在html 中添加 <myPannel title="title" description="pannel description"></mypanel>, 这个myPannel tag 浏览器显然不认识,这个其实就是一个 directive. 这个directive 我

自定义 directive pagination

学习angular过程中,对directive 不是很了解,很有必要自己写一个,以便知道它的各方面的处理方式. directive 中 scope 与 controller 交互,有三种定义策略 "=" ,"@" , "&" 另外一个就是 cope的 双向绑定.是要消耗时间的,并不能立即在controller 中使用 使用: <mypagination start="start" length="len