• 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属性成对出现。

  • 相关阅读:
    用Java开发第一个APP
    去除字符串空格并竖向排列
    并发容器 concurrentHashMap--1.7 更改
    java并发容器CopyOnWriteArrayList 使用场景和内部实现分析
    java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
    并发容器之CopyOnWriteArrayList分析
    单例模式
    [Android]知识总结一:Activity
    阿里巴巴fastjson的使用问题
    java跨域请求的方式
  • 原文地址:https://www.cnblogs.com/darrenji/p/5157296.html
Copyright © 2020-2023  润新知