ngInclude不从index.html加载脚本 - AngularJS

时间:2017-02-28 06:26:20

标签: javascript angularjs gentelella

我正在使用puikinsh/gentelella管理员模板启动一个新的AngularJS项目。

我将index.html的内容部分提取到“仪表板”视图中,并将其替换为ngView。我使用ngInclude将侧边栏部分提取到“侧边栏”视图中。

所有html已成功加载,但现在无法点击侧边栏,并且未加载“仪表板”视图中的所有图表。除了添加angular脚本之外,我没有更改index.html中的任何脚本。

我试图在角度脚本之前放置jQuery脚本,但问题仍然存在。侧边栏工作正常,当我替换ngView&使用视图中的html代码ngInclude。

我错过了什么?

额外:

我的代码:plnkr.co/edit/gOlvOgzvNBcu9cMHBzfd

Getelella管理主题演示:https://colorlib.com/polygon/gentelella/index.html

4 个答案:

答案 0 :(得分:0)

我在index.html中找不到ng-app。您的代码中没有Angular的入口点。检查此样本Plunker。 - https://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq

答案 1 :(得分:0)

我使用vue.js的完整渲染功能进行编码,也遇到了这种情况;

我发现原因是

<!-- Custom Theme Scripts -->
<script src="assets/theme/admin/gentelella/build/js/custom.min.js"></script>
<!--  vue.js components compiled file -->
<script src="{{ asset('js/app.js') }}"></script>
  

现在我改变了他们的顺序,侧边栏的js正在使用底面:

<!--  vue.js components compiled file -->
<script src="{{ asset('js/app.js') }}"></script>
<!-- Custom Theme Scripts -->
<script src="assets/theme/admin/gentelella/build/js/custom.min.js"></script>
  

我认为您还需要(&#39; .... custom.min.js&#39;)在您的js模板中,这可以与模板一起加载。

答案 2 :(得分:0)

请从html标记中删除ng-app指令并将其放在body标记上。 你可以看到输出。

预览plunker在这里: [示例plunker] [1]

[1]: http://plnkr.co/edit/smCHpD3QK0zmfxkUT3CM?p=preview

答案 3 :(得分:0)

我设法通过首先将custom.js中的初始变量声明移至某个函数来使其正常工作。

var CURRENT_URL = '',
    $BODY = '',
    $MENU_TOGGLE = '',
    $SIDEBAR_MENU = '',
    $SIDEBAR_FOOTER = '',
    $LEFT_COL = '',
    $RIGHT_COL = '',
    $NAV_MENU = '',
    $FOOTER = '';

function init_vars() {
    CURRENT_URL = window.location.href.split('#')[0].split('?')[0];
    $BODY = $('body');
    $MENU_TOGGLE = $('#menu_toggle');
    $SIDEBAR_MENU = $('#sidebar-menu');
    $SIDEBAR_FOOTER = $('.sidebar-footer');
    $LEFT_COL = $('.left_col');
    $RIGHT_COL = $('.right_col');
    $NAV_MENU = $('.nav_menu');
    $FOOTER = $('footer');
}

然后在您的角度控制器js文件中,您需要添加一个运行方法,以监听ngInclude'$ includeContentLoaded'发射器。

在我的情况下,我正在使用ng-include作为名为menu.html的副菜单

<div ng-include="'menu.html'" id="sidebar-menu" class="main_menu_side hidden-print main_menu"></div>

'menu.html'文件名是函数中第二个参数(templateName)将使用的文件名。

然后在加载DOM后调用

init_vars()来定义全局变量。

然后我们可以根据加载的内容调用相关的init,如下所示。

app.run(function ($rootScope) {
    $rootScope.$on("$includeContentLoaded", function (event, templateName) {
        init_vars(); //my defined function to load global variables after dom has been loaded
        if (templateName == 'menu.html') { //checking if this ng-include is the one that has loaded
            init_sidebar();
            //... other init functions
        }
    });
});

您将不得不禁用custom.js中的调用,该调用是在DOM加载后初始化所有内容后触发的。 因此,以下代码应在您的custom.js文件中注释掉。

$(document).ready(function () {
    init_sparklines();
    init_flot_chart();
    init_sidebar();
    init_wysiwyg();
    //...other inits
});

如果遇到不断重新加载的问题,只需添加一个全局变量,以指示脚本是否已加载。