【问题标题】:Running JavaScript code from a file in AngularJS directive从 AngularJS 指令中的文件运行 JavaScript 代码
【发布时间】:2016-06-13 09:41:04
【问题描述】:

我在 AngularJS 中为我​​在每个页面上加载的网站的页脚部分创建了一个指令。在里面,我添加了一些需要在页面加载后运行的 jQuery 代码——这是我能想到的唯一解决方案。下面是它的外观示例:

app.directive('footer', function () {
    return {
        restrict: 'A',
        replace: true,
        scope: {user: '='}, 
        templateUrl: "PATH_TO_HTML_FILE",
        controller: ['$scope', '$filter', function ($scope, $filter) {
            // Some random jQuery goes here, for example:
            $('.search-nav > a').on('click', function(){
                $('.search-drop-down').slideDown();
            });

            // Close Search form
            function closeSearchField() {
                $('.search-drop-down').slideUp();
            }
        }]
    };
});

我不确定这是否是最好的方法,但我现在想做的是将控制器中的这个 jQuery 代码放在一个单独的文件中。原因:我们使用的前端不知道 AngularJS 甚至没有提到指令等,所以我只想有一个单独的文件,其中包含在页面加载时运行的所有 jQuery 代码,如果他们可以编辑需要。一旦指令本身被加载,我只想获取文件的内容并在上面的控制器主体中运行它。关于如何做到这一点的任何想法?甚至是整个问题的更好解决方案?

【问题讨论】:

  • 您的网站是SPA(即是否在每次视图更改时重新加载)?如果是 - 您想在每次视图更改时执行此 jquery 代码 还是只执行一次?如果它不是一个 SPA,为什么不直接在标题中包含这个脚本呢?
  • 这里是一个SPA网站。有些代码我想在每次更改时执行,有些则不是。这实际上取决于我在视图中是否有指令,这就是为什么我正在寻找一种方法将指令特定的代码放在单独的空间中,这对于只处理的非角度开发人员来说是可以访问和理解的html、js和css。

标签: javascript jquery angularjs angularjs-directive


【解决方案1】:

您可以在另一个文件中定义控制器并在指令中按名称引用它:

控制器

app.controller('footerCtrl', footerCtrl);

//You are not actually using it in the controller, so you can remove it if you don't need it
footerCtrl.$inject = ['$scope', '$filter'];

function footerCtrl($scope, $filter){
    // Some random jQuery goes here, for example:
            $('.search-nav > a').on('click', function(){
                $('.search-drop-down').slideDown();
            });

            // Close Search form
            function closeSearchField() {
                $('.search-drop-down').slideUp();
            }
}

指令

app.directive('footer', function () {
    return {
        restrict: 'A',
        replace: true,
        scope: {user: '='}, 
        templateUrl: "PATH_TO_HTML_FILE",
        controller: 'footerCtrl'
});

您也可以完全摆脱这段代码,只为动画使用一个 css 类,在单击链接时使用ng-class 添加/删除该类

【讨论】:

  • 那里的代码远不止添加或删除一个类。您的方法很不错,但是,它仍然是一个 Angular 文件,其中包含“奇怪”的东西,例如注入、控制器和其他与 Angular 相关的东西,我想对那些不知道 Angular 到底是什么的人隐藏起来。
  • 唯一的要求是用一个全局函数包装这个 alien 代码,比如function footerCtrl() { /* some random jquery */ },仅此而已。 Angular 现在可以将其用作控制器。 See this.
  • 这只是两行“外星人”代码。他们可以忽略它,剩下的就是纯 JS/jQuery
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
相关资源
最近更新 更多