• javascript钩子之Backbone里的实现


      前段时间,项目里有个需求,就是在某函数之前要添加一下验证,犹豫有很多地方需要添加一样的函数,而且要在这函数之后去执行以前的方法,所以打算用钩子这种东西去实现功能。在网上也看到了一些前辈写的钩子函数,功能大相径庭。就是定义一个数组,把你需要之前的数据插入到一个数组里,调用钩子的时候在把需要执行的功能依次的pop出来。还有一种实现是类似于代码劫持的概念。

    1 var _alert = alert;
    2 window.alert = function(s) {
    3        console.log("Hooked!");
    4         _alert(s);
    5 }

    套用之前的作者的话就是:这种Hook方式跟闹着玩儿似的,用到实际生产上通用性不好,效率也不高。

    就我自身的项目,我是采用了类似拦截的实现方式,因为我没有那么多的嵌套关系,不太需要数组去添加方法。

    项目是用backbone+require开发的SAP应用。

    hook.js

    'use strict';
    define([
        'backbone',
        'underscore',
        'jquery'
    ], function(Backbone,underscore,$){
    
        var Hook = Backbone.Hook = function(){
    
            this.initialize.apply(this, arguments);
    
        }
        _.extend(Hook.prototype,Backbone.Events,{
            initialize : function(){
                _.bindAll(this,'beforeAction','Action','beforeAction');
                this.addListenEvent();
            },
            /**
             * 添加验证钩子,处理权限验证时,无权限的控制方法。
             * @param res
             */
            premissionValidate : function(res){
                console.log(res);
            },
            /**
             * 钩子构造函数
             * @param actionName
             * @param args
             * @param callBack
             * @constructor
             */
            Action : function(args,callBack){
                var actionName = args.actionName;
                if(actionName === undefined){
                    this.defaultAction(callBack);
                }else{
                    //this.trigger(actionName,callBack)
    
                    this[actionName](callBack);
                }
            },
            /**
             *  默认钩子处理函数
             */
            defaultAction : function(callBack){
    
                callBack && callBack();
    
            },
            /**
             * 自定义的动作
             * @param callBack
             */
            beforeAction : function(callBack){
    
                callBack && callBack();
    
            },
            afterAction : function(){
    
            },
            addListenEvent : function(){
                this.on('Action',this.Action);
                this.on('beforeAction',this.beforeAction);
                this.on('premissionValidate',this.premissionValidate)
            }
    
        });
        return Hook;
    
    });

    首先在main函数里注册hook类

    Backbone.hook = new hook();

    调用方法

    设置actionName, 为你之后要去在代码之前或之后执行的程序名。Action为钩子的构造函数。

    $.extend(options,{
        viewer : viewer,
        actionName : 'beforeAction'
    });
    Backbone.hook.trigger('Action',options,function(){
        /**
         * 添加钩子,在页面渲染之前进行某些特殊的动作,默认动作为Action。
         */
        viewer.render(options);
    });

     总结:钩子函数在本项目的应用场景有两个

    第一:在页面渲染之前调用钩子函数,统一入口,方便添加统一逻辑。

    第二:在公共的函数入添加钩子函数,增加验证方法。

  • 相关阅读:
    C++各种进制的转换
    C++获取当前目录
    【转】Caffe初试(十)命令行解析
    libsvm下的windows版本中的工具的使用
    libsvm的数据格式及制作
    【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
    【转】Caffe初试(九)solver及其设置
    【转】Caffe初试(八)Blob,Layer和Net以及对应配置文件的编写
    【转】Caffe初试(七)其它常用层及参数
    Ubuntu 14.04 安装 Sublime Text 3
  • 原文地址:https://www.cnblogs.com/whitelist/p/4758367.html
Copyright © 2020-2023  润新知