当前位置: 首页 > 面试题库 >

指令内的ng-repeat和ng-transclude

申昌勋
2023-03-14
问题内容

我想在内容更改时创建具有自定义行为的列表。我尝试为此创建一个指令,但是我对如何将ng-transclude与ng-
repeat指令结合起来感到迷茫。有人可以让我走上正轨吗?

HTML:

<div ng-app="myApp">
  <div ng-controller="ctrl">
    <mylist items="myItem in items">
       <span class="etc">{{myItem}}</span>
    </mylist>
  </div>
</div>

Javascript:

angular.module('myApp', [])

.controller('ctrl', function ($scope) {
  $scope.items = ['one', 'two', 'three'];
})

.directive('mylist', function () {
  return {
    restrict:'E',
    transclude: 'element',
    replace: true,
    scope: true,
    template: [
      '<ul>',
        '<li ng-repeat="WhatGoesHere in items" ng-transclude></li>',
      '</ul>'
    ].join(''),
    link: function (scope, element, attr) {
      var parts = attr.items.split(' in ');
      var itemPart = parts[0];
      var itemsPart = parts[1];
      scope.$watch(itemsPart, function (value) {
        scope.items = value; 
      });      
    }
  }
});

我已经在这里工作了一部分

编辑:

条件:

  • 该项目的模板必须在视图中定义,而不是在指令中定义,并且必须有权访问子作用域中的项目属性。理想情况下,我想像在ng-repeat指令中那样定义它
  • 该指令必须有权访问列表,以便我可以设置适当的监视并进行更改。如果可能的话,我希望可以轻松访问所生成的DOM项(我也可以使用DOM之类的element[0].querySelectorAll('ul>li')东西,它只能在Chrome上运行)。
  • 如果可能的话,我想重用ng-repeat指令中的逻辑,因为它已经做了很多我想做的事情。最好是我不想复制代码。我只是想增强它的行为,而不是改变它

问题答案:

我自己解决了这个问题:

我可以在编译步骤(jsfiddle)中做到这一点,方法是在编译ng- repeat模板时添加属性,并向其提供属性的内容。

HTML:

<div ng-app="myApp">
  <div ng-controller="ctrl">
    <mylist element="myItem in items">{{myItem}}</mylist>
  </div>
</div>

Javascript:

var myApp = angular.module('myApp', [])

.controller('ctrl', function ($scope) {
  $scope.items = ['one', 'two', 'three'];
})

.directive('mylist', function ($parse) {
  return {
    restrict:'E',
    transclude: 'element',
    replace: true,
    scope: true,
    template: [
      '<ul>',
      '<li ng-transclude></li>',
      '</ul>'
    ].join(''),
    compile: function (tElement, tAttrs, transclude) {
      var rpt = document.createAttribute('ng-repeat');
      rpt.nodeValue = tAttrs.element;
      tElement[0].children[0].attributes.setNamedItem(rpt);
      return function (scope, element, attr) {
        var rhs = attr.element.split(' in ')[1];
        scope.items = $parse(rhs)(scope);
        console.log(scope.items);
      }        
    }
  }
});


 类似资料:
  • 问题内容: 嗨,我有一个简单的ng-repeat-start和end用例,并且工作正常,当我想添加一个内部ng-repeat时出现了问题。这是我的代码 内部ng-repeat到td元素中不起作用,在检查html源代码时看到ngRepeat注​​释,但未创建td元素。 我的丑陋的解决方法(假设我知道该向量的大小)是: 问题答案: 从那时起,我不确定是否使用角度1.1.6,并且在1.1.5或1.0.7

  • 问题内容: 我有以下设置: 应用/指令 控制者 HTML: 这是一个非常简单的示例,但是我无法渲染它。也许有些教程没有告诉我,或者这是Angular的秘密知识? 如果我改为在and位置内删除该指令,它将显示所有记录。 但是我希望该指令比仅一个指令(最终)要复杂,以便可以在多个应用程序中重用此指令。 所以,我真的在问我们如何正确创建ng-repeat内的指令?我想念什么?上面的代码应该删除什么? 问

  • 问题内容: 我正在构建一个简单的angularjs应用,并且试图实现无需页面刷新的登录。 我在做什么 初始化时,ng-include会加载/ set / save。/ set / save 中有。因此,当单击指令时,将打开一个窗口,并且当关闭窗口时,应更改ng-include的src。 问题 当指令在ng-include内部使用时(ng-include src在init上具有默认值)时,什么都不会

  • 问题内容: 我有一张桌子,其中的行通过重复。我正在尝试创建一个模板,为每一行生成列 问题是我的自定义td模板根本没有呈现。在这里,我打算用n个s 代替- 这将根据我的数据对象上的属性数量来确定,但是目前,我只是试图获得一个简单的指令,该指令将输出两列。 MYPLUNKER:显示此问题的一个实例和指令代码。 问题答案: 如注释中所指出,指令模板应具有单个根元素。因此,我建议您将元素移动到指令的模板,

  • 问题内容: 我花了一段时间试图找到一个优雅的解决方案,而我却找到了一个“可行”的解决方案,它感觉不是最简单或正确的做事方式。 所以,我的问题是…如何动态加载指令!在某些情况下,以下是我希望我能摆脱它的方式!除了模板加载之外,我没有包含路由或其他任何内容,而是为下面的控制器分配了ng- controller。 app.js template.html 任何人都可以提供的建议将不胜感激,如果我做任何明

  • Angularjs ng用div标记重复。。我有一个带有div标记的代码,如图所示。。我想重复整个div,在第二个循环中img src是不同的。。如何使用angularjs中的ng repeat指令执行此操作?