用d3动画ng-repeat指令模板时出现问题

科布勒

我正在尝试使用Angular和D3创建类别列表。我已经为此列表创建了一条指令,并且我模板中的某些子节点使用ng-repeat,因为我想用角度生成html而不是d3。

我的问题是,当尝试使用d3引用ng重复的元素时,尚未创建它们。如果我使用链接功能,则列表中没有任何项目。如果使用compile函数,则可以看到1个列表项,但至少应有2个。

在这里看到

取自小提琴:

angular.module('myApp').directive('targetingCategories', function(){
  return {
    restrict: 'E',
    scope: {
      data: '='
    },
    template: '<div>'+
        '<ul class="catList">'+
          '<li ng-repeat="cat in data.categories">'+
            '{{cat.name}}'+
            '<ul class="subCatList">'+
              '<li ng-repeat="subcat in cat.categories">{{subcat.name}}</li>'+
            '</ul>'+
          '</li>'+
        '</ul>'+
      '</div>',
    replace: true,
    compile: function($tEl, $attrs){

      // attach d3 on the TEMPLATE element, and look for list items
      var vis = d3.select($tEl[0]);
      var catList = vis.select('.catList');
      var catListFirstItem = vis.select('.catlist>li');
      var catListItems = vis.selectAll('.catList>li');

      console.log(catList); // 1 item returned (the ul)
      console.log(catListFirstItem); // 1 item returned (the first li)
      console.log(catListItems); // 1 items returned ??

      return function($scope, $el, $attrs){
        // attach d3 to INSTANCE element and look for list items
        var vis = d3.select($el[0]);
        var catList = vis.select('.catList');
        var catListFirstItem = vis.select('.catlist>li');
        var catListItems = vis.selectAll('.catList>li');

        console.log(catList); // 1 item returned (the ul)
        console.log(catListFirstItem); // 1 item returned (the first li)
        console.log(catListItems); // 0 items returned ??
      };

    }
  };
});

这个想法是让我的标记有角度,然后对其进行d3动画处理。与使用CSS动画相比,我喜欢d3给我的控件。

当我使用d3创建我的列表项时,它工作得很好我很想再做一次,但是我认为将LI放在模板中是一种更好的体系结构。

我在想我需要调用一个编译,或等待一个或某些东西。我几乎快要掌握Angular知识了,所以这里的任何教育都值得赞赏。

科布勒

我要添加自己的潜在答案,但不要打扰,以防其他任何人有更好的选择。

就目前而言,似乎实现此目的的一种方法是用其他嵌套指令(特别是“ mainCategory”和“ subCat”)替换主模板中的LI。然后,我可以将d3附加到动画的适当实例元素上。通过包含索引属性属性,我可以控制使动画交错的延迟。感觉有点令人费解并且“骨干式”(为了对象而使用对象),但是它解决了我的问题。它还使我可以附加一些ng-click,而这与d3创建我的LI无关紧要/不可能。

是的,我知道我的属性称为“数据”,可能会有问题,但是现在我不必担心。我对服务/控制器/指令的使用进行的任何更正都值得赞赏:)

更新了JSFiddle

angular.module('myApp').directive('targetingCategories', function(){
  return {
    restrict: 'E',
    scope: {
      data: '='
    },
    template: '<div>'+
        '<ul class="catList">'+
          '<main-category ng-repeat="cat in data.categories" index="$index">'+
            '{{cat.name}}'+
            '<ul class="subCatList">'+
              '<sub-cat ng-repeat="subcat in cat.categories" index="$index" data="subcat">{{subcat.name}}</sub-cat>'+
            '</ul>'+
          '</main-category>'+
        '</ul>'+
      '</div>',
    replace: true
  };
});

angular.module('myApp').directive('mainCategory', function(targetingService){
  return {
    restrict: "E",
    scope: {
      index: "=",
      data: "="
    },
    template: '<li ng-transclude ng-click="selectCategory($event, data);"></li>',
    replace: true,
    transclude: true,
    link: function($scope, $el, $attrs){
      d3.selectAll($el).transition()
        .duration(500)
        .delay(function(){ return $scope.index*200; })
        .ease('elastic')
        .style('width', '100%')
        .style('padding', '10px');

      $scope.selectCategory = function($event, cat){
        $event.stopPropagation();
        targetingService.selectCategory(cat);
      };
    }
  };
});

angular.module('myApp').directive('subCat', function(targetingService){
  return {
    restrict: "E",
    scope: {
      index: '=',
      data: '='
    },
    template: '<li ng-transclude ng-click="selectSubCategory($event, data)"></li>',
    replace: true,
    transclude: true,
    link: function($scope, $el, $attrs){
      d3.selectAll($el).transition()
        .duration(100)
        .delay(function(d,i){ return 500+($scope.index*200); })
        .ease('linear')
        .style('height', '30px')
        .style('padding', '8px');

      $scope.selectSubCategory = function($event, subCat){
        $event.stopPropagation();
        targetingService.selectSubCategory(subCat);
      };
    }
  };
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过Jquery用视频填充容器时出现问题

来自分类Dev

部署时使用capistrano 3出现问题

来自分类Dev

用d3_sankey重现Sankey图表示例时出现问题

来自分类Dev

处理d3动画队列时,可以替代eval()

来自分类Dev

d3驱动的指令转换在ng-repeat中不起作用

来自分类Dev

创建折线图的D3工具提示时出现问题

来自分类Dev

用wordpress在PHP中生成表时出现问题

来自分类Dev

用python发布json数据时出现问题

来自分类Dev

使用D3 JS通过ID选择元素时出现问题

来自分类Dev

用Discord.JS创建频道时出现问题

来自分类Dev

使用gtk + 3和CSS时出现问题

来自分类Dev

动画和单击链接时出现问题

来自分类Dev

复制2D阵列时出现问题

来自分类Dev

使用OpenGL 3绘制3D立方体边缘时出现问题

来自分类Dev

绘制3D图形时出现问题

来自分类Dev

用状态重新排序组件时出现问题

来自分类Dev

通过templateUrl加载指令模板时,ng-repeat不绑定

来自分类Dev

用同理心连接MSN时出现问题

来自分类Dev

应用应用模板时出现问题

来自分类Dev

用烧瓶设置Chartkick时出现问题

来自分类Dev

用HTML显示磁盘中的图像时出现问题

来自分类Dev

使用按钮动画加载场景异步时出现问题

来自分类Dev

用dd还原映像文件时出现问题

来自分类Dev

在HTML页面上放置多个d3图形时出现问题

来自分类Dev

ng-repeat指令的动画问题

来自分类Dev

在2D GUI上渲染3D模型时出现问题

来自分类Dev

下载python 3时出现问题

来自分类Dev

用scanf存储字符串时出现问题

来自分类Dev

从指令模板传递到控制器时未定义的 ng-repeat 变量