javascript - 使用 Angular 指令动态注入(inject)可运行的 JavaScript

标签 javascript angularjs angularjs-directive

我一整天都在尝试使用自定义 Angular 指令从 API 调用中动态加载带有 JavaScript 的脚本标签。我收到一个很大的错误,指出 JavaScript 代码字符串中的第一个字符是意外的。这是我的代码...

Controller :

var html = '<div id="donutchart" style="width: 200px; height: 200px;"></div>';
var javascript = 'google.load("visualization", "1", {packages:["corechart"]});google.setOnLoadCallback(drawChart); ' +
            'var drawChart = function() {' +
            'var data = google.visualization.arrayToDataTable(' +
            '[["Task", "Hours per Day"],["Work", 11],["Eat",2],["Commute",  2],["Watch TV", 2],["Sleep",    7]]);' +
            'var options = {title: "My Daily Activities",pieHole: 0.4};' +
            'var chart = new google.visualization.PieChart(document.getElementById("donutchart"))};' +
            'chart.draw(data, options)';

$scope.html = $sce.trustAsHtml(html);
$scope.javascript = $sce.trustAsJs(javascript);

HTML:

<bind-javascript html="{{html}}" javascript="{{javascript}}"></bind-javascript>

指令:

(function() {
var directive = function() {
    return {
        restrict: 'E',
        scope: {
            html: '@',
            javascript:'@'
        },
        replace: false,
        template: '<div class="binded-javascript" id="donutchart" ng-bind-html="html"></div>',
        link:function($scope, element, attr) {
            var script = angular.element(document.createElement('script'));
            var source = $sce.trustAsJs($scope.javascript);
            script.innerHTML = source;
            angular.element(document.getElementsByTagName('head')[0]).append(script);
        }
    };
};

angular.module('app')
    .directive('bindJavascript', directive);
}());

最佳答案

这个周末我真的弄明白了。我对指令做了正确的事情,但我最大的问题是,在我的指令中,它在我试图用来创建 Google Chart 的 div 中嵌套了一个 div,因此它没有呈现它。我还为 HTML 提供了一个 id,因此一次无法呈现多个图表。这是我的解决方案:

Controller :

    var html = '<div style="width: 200px; height: 200px;"></div>';
    var javascript =
    '(function () {' +
    'var data = google.visualization.arrayToDataTable(' +
    '[["Task", "Hours per Day"],["Work", 11],["Eat",2],["Commute",  2], ["Watch TV", 2],["Sleep",    7]]);' +
    'var options = {title: "My Daily Activities",pieHole: 0.4};' +
    'var firstChild = document.getElementsByClassName("binded-javascript");' +
    'for(var x = 0; x < firstChild.length; x++) {' +
    'var chart = new google.visualization.PieChart(firstChild[x]);'+
    'chart.draw(data, options);' +
    '}' +
    '})();';

    $scope.html = html;
    $scope.javascript = javascript;

HTML:

<bind-javascript html="{{html}}" javascript="{{javascript}}"></bind-javascript>

指令:

(function() {
var directive = function($parse, $sce) {
    return {
        restrict: 'E',
        scope: {
            html: '@',
            javascript:'@'
        },
        replace: false,
        template: '<div class="binded-javascript"></div>' +
                            '<div ng-bind-html="trustedHTML"></div>',

        link:function($scope, element, attr) {
            $scope.trustedHTML = $sce.trustAsHtml($scope.html);
            var script = angular.element(document.createElement('script'));
            var source = $scope.javascript;
            script[0].text = source;
            angular.element(element).append(script[0]);
        }
    };
};

angular.module('cloud4wi')
    .directive('bindJavascript', directive);
})();

关于javascript - 使用 Angular 指令动态注入(inject)可运行的 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511232/

相关文章:

javascript - 在 HTML5 游戏中实现计时器

javascript - 如何从 Dojo 声明性小部件访问局部变量

javascript - 如何返回 AngularJS 函数的 $http 响应?

javascript - 当我将 JS 版本更改为 3.3.7 时,Bootstrap 选项卡停止工作

javascript - 将变量传递给工厂?

angularjs - 构建 angularJS 音频播放器的最佳方法是什么?

javascript - ng-repeat 项目在父指令的链接后功能中不可用

带 Angular jQuery 问题

javascript - 不要触发 form.$invalid 在第一次加载时

javascript - ubuntu 18.04- Ember : command not found