AdminLte 框架 和 requireJs 整合的问题

摘要:
最近在做一个基于adminLte框架的项目,在我将require引进项目之后,框架中的adminlte.js中搞的左侧边栏就不起作用了。刚开始以为是各位不符合requireJs的书写格式,随后将adminLTe。js的源码修改为define()的格式,然而当然还是没有效果。define(['jquery'],function(){if(typeofjQuery==='undefined'){thrownewError('AdminLTErequiresjQuery')}}这是开头,源码里都是自执行函数,一共8个函数,分别是其中的Tree函数是负责左侧导航栏下拉与收回的。data){varoptions=$.extend$this.data}})}varold=$.fn.tree$.fn.tree=Plugin$.fn.tree.Constructor=Tree//NoConflictMode//================$.fn.tree.noConflict=function(){$.fn.tree=oldreturnthis}//TreeDataAPI//=============$.each}关键问题在于TreeDataAPI这个地方下边是源代码$.on在这里windowload函数并没有执行。

最近在 做一个基于 adminLte 框架的项目,在我将 require 引进项目之后,框架中的 adminlte.js 中搞的左侧边栏 就不起作用了。

刚开始以为是 各位不符合 requireJs 的书写格式,随后将 adminLTe。js 的 源码 修改为 define() 的格式,然而 当然还是没有效果。

define(['jquery'],function() {
       if (typeof jQuery === 'undefined') {
           throw new Error('AdminLTE requires jQuery')
       }
}

这是 开头,源码里都是自执行函数,一共8个函数,分别是其中的Tree 函数 是 负责 左侧 导航栏 下拉与收回的。

+ functionTree($) {
            'use strict'
            var DataKey = 'lte.tree'
            var Default ={
                animationSpeed: 500,
                accordion: true,
                followLink: false,
                trigger: '.treeview a'
            }
            var Selector ={
                tree: '.tree',
                treeview: '.treeview',
                treeviewMenu: '.treeview-menu',
                open: '.menu-open, .active',
                li: 'li',
                data: '[data-widget="tree"]',
                active: '.active'
            }
            var ClassName ={
                open: 'menu-open',
                tree: 'tree'
            }
            var Event ={
                collapsed: 'collapsed.tree',
                expanded: 'expanded.tree'
            }
            //Tree Class Definition
            //=====================
            var Tree = function(element, options) {
                this.element =element
                this.options =options
                $(this.element).addClass(ClassName.tree)
                $(Selector.treeview + Selector.active, this.element).addClass(ClassName.open)
                this._setUpListeners()
            }
            Tree.prototype.toggle = function(link, event) {
                var treeviewMenu =link.next(Selector.treeviewMenu)
                var parentLi =link.parent();
                var isOpen =parentLi.hasClass(ClassName.open)
                if (!parentLi.is(Selector.treeview)) {
                    return
                }
                if (!this.options.followLink || link.attr('href') === '#') {
                    event.preventDefault()
                }
                if(isOpen) {
                    this.collapse(treeviewMenu, parentLi)
                } else{
                    this.expand(treeviewMenu, parentLi)
                }
            }
            Tree.prototype.expand = function(tree, parent) {
                var expandedEvent =$.Event(Event.expanded)
                if (this.options.accordion) {
                    var openMenuLi =parent.siblings(Selector.open)
                    var openTree =openMenuLi.children(Selector.treeviewMenu)
                    this.collapse(openTree, openMenuLi)
                }
                parent.addClass(ClassName.open)
                tree.slideDown(this.options.animationSpeed, function() {
                    $(this.element).trigger(expandedEvent)
                }.bind(this))
            }
            Tree.prototype.collapse = function(tree, parentLi) {
                var collapsedEvent =$.Event(Event.collapsed)
                tree.find(Selector.open).removeClass(ClassName.open)
                parentLi.removeClass(ClassName.open)
                tree.slideUp(this.options.animationSpeed, function() {
                    tree.find(Selector.open + ' > ' +Selector.treeview).slideUp()
                    $(this.element).trigger(collapsedEvent)
                }.bind(this))
            }
            //Private

            Tree.prototype._setUpListeners = function() {
                var that = this
                $(this.element).on('click', this.options.trigger, function(event) {
                    that.toggle($(this), event)
                })
            }
            //Plugin Definition
            //=================
            functionPlugin(option) {
                return this.each(function() {
                    var $this = $(this)
                    var data = $this.data(DataKey)
                    if (!data) {
                        var options = $.extend({}, Default, $this.data(), typeof option == 'object' &&option)
                        $this.data(DataKey, new Tree($this, options))
                    }
                })
            }
            var old =$.fn.tree
            $.fn.tree =Plugin
            $.fn.tree.Constructor =Tree
            //No Conflict Mode
            //================
            $.fn.tree.noConflict = function() {
                $.fn.tree =old
                return this
            }
            //Tree Data API
            //=============

            $(Selector.data).each(function() {
                Plugin.call($(this));
            })
}(jQuery)

关键问题在于

Tree Data API 这个地方
下边是源代码
$(window).on('load',function() {
    $(Selector.data).each(function() {
        Plugin.call($(this));
    })
})

在这里 window load 函数并没有执行。

在 函数内打印 也没有执行。我将 外层的 load 的函数删掉了。然后。。。。 问题就解决了。

//Tree Data API
            //=============

            $(Selector.data).each(function() {
                Plugin.call($(this));
            })

我现在还不知道 为什么 load 函数为什么没有执行,可能 是因为 我之前引入了 domReady 函数的缘故吧。

既然解决了,就将 函数整体装进一个 匿名函数中 return,然后在 启动文件中引用就行了。

define([
    'domReady!',
    'require',
    'angular',
    'angular-route',
    'jquery',
    'bootstrap',
    'jquerydataTables',
    'datatables.net',
    'app',
    'routes',
    'controller'
],function(doc,require,angular) {
    angular.bootstrap(doc,['myapp']);
    require(['adminlte'],function(adminlte) {   在这里引用之后直接执行。因为函数里都是自执行函数。
        console.log(adminlte)
        adminlte();
    })
})

adminlte.js 中一共8个函数 ,出问题的原因基本都可以确定为 window.onload 没有执行。

免责声明:文章转载自《AdminLte 框架 和 requireJs 整合的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Nodejs mysql 数据库增、删、改、查 操作Java中的异常处理机制的简单原理和应用?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS 如何截取日期部分呢?

最佳答案   如果这个日期格式是固定的话: var time = strTime.substring(0, strTime.indexOf(' '));这样就可以了。 其中indexOf(' ')表示第一个空格所在位置。请及时采纳!谢谢! @Anders_Zeus:  substring 方法用于提取字符串中介于两个指定下标之间的字符 substrin...

svn_linux + apache 实现网页访问svn

CentOS7:搭建SVN + Apache 服务器实现网页访问 1. 安装httpd 安装httpd服务: $ sudo yum install httpd 检查httpd是否安装成功: $ httpd -version Server version: Apache/2.4.6 (CentOS) Server built: Jul 18 20...

关于 angular 项目 结合 RequireJs 的问题整理

1、在 将 依赖的js 通过 require.config 设置 映射的时候,结合dataTables.bootstrap.js和 jquery.dataTables.js 时 遇到如下报错: Uncaught Error: Script error for "datatables.net", needed by: dataTablesbootstrap;...

白月黑羽Python在线教程

推荐白月黑羽Python在线教程 白月黑羽 站在初学者的角度为大家安排了Python学习教程,帮助大家迅速掌握程序开发技能。 http://www.python3.vip/doc/tutorial/python/home/ 变量 和 注释 本文目录 变量的概念 变量的命名规则 变量值的变化 我们已经知道,Python语言中,所有的数据类型都是对象。 整...

二三维联动

前端界面: JS代码: //点击进行二三维联动 functionesMapAs() { $("#cesiumContainer").css('width','47%'); $("#mapContainer").css('width','47%'); $("#mapContainer").css('left','53%');...

lodash按需引入

lodash提供了很多可用的方法供我们使用,绝对是一个很好用且用起来得心应手的工具库。但是同时,lodash的体积也不小,我们项目中使用的大概522K,可能只是使用了几个方法,但是却把整个lodash库引入了。为了吃几条鱼,就承包了整个鱼塘,代价有点大呀! 对于这个问题,有几种方案可供选择。 一.引入单个函数  lodash整个安装完之后,引用方式: lo...