【问题标题】:Dygraphs not working with ng-repeatDygraphs 不适用于 ng-repeat
【发布时间】:2015-05-26 18:50:05
【问题描述】:

我是 AngularJS 的新手,并使用 dygraphs 构建仪表板。

试图将 dygraphs 网站上的 example code 放在 ng-repeat-list 中,只是为了测试。预计 y 中的每个 x 都有相同的样本图。不幸的是,没有绘制图表,只有轴,控制台没有显示任何错误。

<li ng-repeat="x in y">
    <div id="graph">
        <script>
            new Dygraph(document.getElementById("graph"),
                   [ [1,10,100], [2,20,80], [3,50,60], [4,70,80] ],
                   { labels: [ "x", "A", "B" ] });
        </script>
    </div>
</li>

如果我删除 ng-repeat,它仍然可以工作(单图)——所以 dygraphs-code 是有效的。当然,像我在这里所做的那样直接在视图中绘制图形是没有意义的,但我仍然想知道为什么它不起作用。我在这里遗漏了一些一般性观点吗?

【问题讨论】:

    标签: angularjs ng-repeat dygraphs


    【解决方案1】:

    您的问题是 Angular 会重复您的 &lt;div id="graph"&gt; n 次。因此,您现在有 n 次 div,其 id 为“graph”,它们是兄弟姐妹。因此,当您致电document.getElementById('graph') 时,效果不会很好。

    也就是说,我也不知道 ng-repeat 中的脚本标签效果如何,这似乎是一个非常奇怪的用例。

    执行此操作的正确方法(与所有与 DOM 相关的操作一样)是使用指令。这是一个例子:

    Javascript:

    var myApp = angular.module('myApp',[]);
    
    myApp.controller('MyCtrl', function($scope) {
        $scope.graphs = [
            {
                data: [ [1,10,100], [2,20,80], [3,50,60], [4,70,80] ],
                opts: { labels: [ "x", "A", "B" ] }
    
            },
            {
                data: [ [1,10,200], [2,20,42], [3,50,10], [4,70,30] ],
                opts: { labels: [ "label1", "C", "D" ] }
    
            }
        ];
    });
    
    myApp.directive('graph', function() {
        return {
            restrict: 'E', // Use as element
            scope: { // Isolate scope
                data: '=', // Two-way bind data to local scope
                opts: '=?' // '?' means optional
            },
            template: "<div></div>", // We need a div to attach graph to
            link: function(scope, elem, attrs) {
    
                var graph = new Dygraph(elem.children()[0], scope.data, scope.opts );
            }
        };
    });
    

    HTML:

    <div ng-controller="MyCtrl">
        <graph ng-repeat="graph in graphs" data="graph.data" opts="graph.opts"></graph>
    </div>
    

    JSFiddle

    希望这会有所帮助!

    【讨论】:

    • 非常感谢,这让我的指令更加清晰并完成了工作!
    • 不错的答案,我在处理这个问题时发现了一个小问题,即我无法找到一种方法来指定用于标签的 div。关于如何添加它的任何想法?由于需要使用 ID 在数据中指定 labelsDiv,我无法找到解决方法:(
    • 我假设您指的是labelsDiv。根据文档,您还可以传入一个元素。因此,您添加了一个新的 div,您希望标签出现在指令的模板中。因此,您将有两个兄弟 div,一个用于图形本身,一个用于标签。然后你取出这两个元素,并将标签元素的引用注入你提供给 dygraph 的数据,以及你提供给 dygraph 构造函数的图形元素,就像以前一样。让我知道这是否有意义。
    • @SveinT 。感谢分享您的回答。我的问题与此有关stackoverflow.com/questions/43521905/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多