【问题标题】:generating a unique id and class for variable number of directives为可变数量的指令生成唯一的 id 和类
【发布时间】:2015-03-19 10:04:33
【问题描述】:

Here's a jsbin 说明了这个问题,但我将在下面用代码解释它。我正在 AngularJs 中创建一个自定义指令,它将为数据库中的每个条目插入一次,我使用 ng-repeat 对其进行迭代,如您在此处看到的。

 <div ng-controller="DemoCtrl as demo">

    <h1> Hello {{ name }}

<div class="some-list" ng-repeat="customer in customers">

 <div id="not-unique"  class="not-unique" my-dumb-graphic datajson=customer></div>
I need to make a unique class or id

  </div>

</div>

如果您没有注意到,隐藏在该代码中的指令是 my-dumb-graph,下面的代码中有相应的 myDumbGraphic 名称。为了插入图形,我将在下面指令的链接函数中执行此操作,我需要能够在上面的 html 中选择一个唯一的 id 或类,并且我需要能够选择它从指令中的链接函数中,所以不知何故需要从js中的html引用id。您可以在 jsbin 中看到,在指令的链接函数中,id 还不是唯一的(即尚未计算动态部分),即使它在渲染到 dom 时最终是唯一的。

<div id="not-unique"  class="not-unique" my-dumb-graphic datajson=customer></div>

其余代码 var app = angular.module('jsbin', ['ngRoute']) .config(函数 ($routeProvider) { '使用严格';

        var routeConfig = {
            controller: 'DemoCtrll'

        };
        $routeProvider
            .when('/', routeConfig)
            .otherwise({
                redirectTo: '/'
            });
});

app.controller('DemoCtrl', function($scope, $routeParams) { 
   $scope.name = "World";
   $scope.customers = [
        {
            name: 'David',
            street: '1234 Anywhere St.'
        },
        {
            name: 'Tina',
            street: '1800 Crest St.'
        },
        {
            name: 'Michelle',
            street: '890 Main St.'
        }
    ];

});
app.directive('myDumbGraphic', function () {

    return {
            restrict: 'A', 
            scope: {
                datajson: '='
            },


             link: function (scope, elem, attrs) {

                ...code to insert my dumb graphic...need to select unique id or class or both...need to select unique id from here

            }
        };

    });

更新

正如一些人所建议的,有多种方法可以为 div 创建动态 id,但是,当我在链接函数中需要它时,不会计算 div id 的动态部分。例如,如果根据其他答案的建议,我将 html 中的 id 设置为这个 &lt;div id="id_{{::id}}",那么它的动态部分不会在我需要它到链接函数内部时计算出来,尽管如果我检查dom 渲染后计算。在链接功能中,我可以通过像这样的elem访问div "#"+elem[0].id;并且日志语句显示当时它还没有计算——这就是日志语句为 "#"+elem[0].id 显示的内容; ----> #id_{{::id}}

【问题讨论】:

  • 您已经在指令范围内拥有客户对象的实例。大概您对每个客户都有一些唯一标识符,那么为什么您不能访问它的数据?
  • @charlietfl 查看 OP 的更新。是的,有很多方法可以创建唯一标识符,但是当我尝试在 html 中设置它时,它不会在我在链接函数中需要它时计算出来。 OP 中的更新示例
  • 我为什么需要元素 ID? Angular 管理 DOM,您很少需要关注元素 ID
  • @charlietfl 我需要使用 D3 (` d3.select(el).append('svg'); `) 选择一个元素,以便在页面上为从中检索到的每个条目插入一个图表分贝。如果我只使用 angular 提供的静态 div,当 d3 选择元素时,它会选择它找到的第一个元素,因此所有图表都会为 db 中的第一个条目插入,并且页面上的后续条目没有他们旁边的图表。因此需要 d3 可以为每个条目选择的唯一 id
  • 但是您不是在指令中初始化图表,因此指令中的元素可用吗?这似乎仍然是一个 X-Y 问题

标签: angularjs


【解决方案1】:
  1. 指令链接函数有相应的元素作为参数传入,所以你已经有了选择器:

    链接:函数(范围、元素、属性){

    }

  2. 或者,您可以利用 $scope.customers 数组键作为唯一 id 并设置视图元素,将 id 传递到指令中,并将其用作选择器(假设您已加载 jQuery):

    <h1> Hello {{ name }} </h1>
    
    <!-- use customers array index -->
    <div class="some-list" ng-repeat="(customerId, customer) in customers">
    
      <!-- append customer id to this element id so it is unique -->
      <div id="directive-element-selector-{{customerId}}"  class="not-unique" my-dumb-graphic datajson=customer customer-array-id=customerId></div>
        <div id="inner-selector-{{customerId}">
          I need to make a unique class or id
        </div>
      </div>
    </div>
    

指令:

app.directive('myDumbGraphic', function () {
  return {
    restrict: 'A', 
    scope: {
      datajson: '=',
      customerArrayId: '='
    },

   link: function (scope, elem, attrs) {

      $('#directive-element-selector-' + customerArrayId) // jQuery selector, this should equal elem pass in as link function param

      $('#inner-selector-' + customerArrayId) // inner selector

    }
  };
});

【讨论】:

  • 动态 id 的计算值不能通过 elem 参数获得。如果按照其他答案的建议,我将 html 中的 id 设置为此
    #id_{{::id}}
  • fyi 这是一个演示问题的演示 jsbin.com/caduranume/1 --查看链接函数中的 log 语句结果,您可以看到 id 尚未计算
【解决方案2】:

您可以使用 $scope $id 属性,该属性对于系统中的每个指令和范围都是唯一的,因此您可以执行类似的操作

<div class="myclass_{{::$id}}"></div>

或者类似的东西

注意: :: 是一次绑定

【讨论】:

  • 谢谢,我如何从链接功能中选择它,如$scope.id
  • 只是 scope.$id 如果您要更改当前的 html 标签或只是在模板中使用 $id
  • 这不起作用。如果我将 div 设置为 myid_{{::$id}} 那么当我尝试通过链接函数中的 elem 参数选择它时 ::$id 部分尚未计算。你知道为什么吗?
  • 对不起,我之前在 ipad 上。这可能更清楚。如果我在 html 中将 id 设置为此 &lt;div id="id_{{::id}}" ,那么它的动态部分将不会在我需要它到链接函数内部时计算出来,尽管如果我在渲染它之后检查 dom 它已经计算出来。在链接函数中,我可以像 "#"+elem[0].id; 这样通过 elem 访问 div,并且日志语句显示当时它还没有计算 - 这是日志语句为 "#"+elem[0].id; 显示的内容----> #id_{{::id}}
  • 这是一个演示问题jsbin.com/caduranume/1 --查看链接函数中的日志语句的结果,您可以看到id尚未计算。
猜你喜欢
相关资源
最近更新 更多
热门标签