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

AngularJS:以编程方式将ngIf添加到指令的最佳实践是什么?

龚苏燕
2023-03-14
问题内容

我想创建一个指令,该指令根据来自服务的值来检查dom中是否应包含元素(例如,检查用户角色)。

相应的指令如下所示:

angular.module('app', []).directive('addCondition', function($rootScope) {
    return {
        restrict: 'A',
        compile: function (element, attr) {
          var ngIf = attr.ngIf,
              value = $rootScope.$eval(attr.addCondition);

          /**
           * Make sure to combine with existing ngIf!
           * I want to modify the expression to be evalued by ngIf here based on a role 
           * check for example
           */
          if (ngIf) {
            value += ' && ' + ngIf;
          }

          attr.$set('ng-if', value);
        }
    };
});

最后,该元素具有ng-if属性,但由于某种原因它不适用于该元素,并且仍然存在于dom中。因此,这显然是错误的方法。

这个小提琴显示了问题:http :
//jsfiddle.net/L37tZ/2/

谁能解释为什么会这样?还有其他方法可以实现类似的行为吗?应该考虑现有的ngIf。

用法: <div rln-require-roles="['ADMIN', 'USER']">I'm hidden when theses role requirements are not satifisfied!</div>

.directive('rlnRequireRoles', function ($animate, Session) {

  return {
    transclude: 'element',
    priority: 600,
    terminal: true,
    restrict: 'A',
    link: function ($scope, $element, $attr, ctrl, $transclude) {
      var block, childScope, roles;

      $attr.$observe('rlnRequireRoles', function (value) {
        roles = $scope.$eval(value);
        if (Session.hasRoles(roles)) {
          if (!childScope) {
            childScope = $scope.$new();
            $transclude(childScope, function (clone) {
              block = {
                startNode: clone[0],
                endNode: clone[clone.length++] = document.createComment(' end rlnRequireRoles: ' + $attr.rlnRequireRoles + ' ')
              };
              $animate.enter(clone, $element.parent(), $element);
            });
          }
        } else {

          if (childScope) {
            childScope.$destroy();
            childScope = null;
          }

          if (block) {
            $animate.leave(getBlockElements(block));
            block = null;
          }
        }
      });
    }
  };
});

在指令中添加优先级非常重要,否则,不会评估附加到该元素的其他指令!


问题答案:

您的问题的第一部分“为什么?”是我可以回答的问题:

您遇到的问题是,不能在不调用元素的情况下将指令动态地应用于$compile元素。

如果$compile(element)(element.scope())在设置属性后调用,则会由于您正在编译自己而导致堆栈溢出,这会导致您进行编译,进而导致您进行编译等。

第二部分“如何实现”,我遇到了麻烦。我尝试了几种方法(例如用嵌套的内容替换内容ng-if),但是我无法确切地找到您要查找的行为。

我认为下一步可能是研究ng-
if
的代码,并尝试直接在您的指令中实现类似的功能。

这是使它工作的第一步。我希望它需要一些清理和修改才能使其按您真正想要的方式工作。



 类似资料:
  • 问题内容: 在应用程序中是否有任何良好的GUI作为小部件支持Pygame表面? 如果这不可能或不可行,那么哪个GUI工具箱具有最佳的图形组件?我希望通过SDL包装器保持快速渲染成为可能。 问题答案: 在这里,您将获得有关如何整合以及进行互动和互动的说明。 在我看来,最好的GUI工具包是wxPython(wxWidgets的绑定),它具有几乎包括OpenGL小部件在内的所有GUI小部件,并且SDL也

  • 问题内容: 我将开始使用AngularJS进行客户端和Django进行服务器端项目。 使他们像最好的朋友一样工作的最佳实践是什么(静态文件,身份验证,部署等) 问题答案: 有多种方法可以从Django模板中为客户端模板提供支持,以实现有趣的优化。但是,鉴于Django和AngularJS的模板语言之间的相似之处,在这里几乎不值得付出任何努力。对于此类大多数项目,我会将AngularJS的静态服务与

  • 问题内容: 我最近写了我的第一个Android应用程序,大约有8,000-10,000行代码。一直阻碍我使用常规设计模式的一件事是android对异步调用(打开对话框,活动等)的大量使用。因此,我的代码很快就开始看起来像“意大利面”,而我最终开始不喜欢某些类。 是否有适用于任何人都会推荐的系统的特定设计模式或编程方法?对于编写可管理的异步代码有什么建议吗? 问题答案: 使用全局变量 如果您不想用简

  • 问题内容: 我正在阅读 http://www.alexrothenberg.com/2013/02/11/the-magic-behind-angularjs- dependency-injection.html ,事实证明,如果您缩小JavaScript的大小,angularjs依赖项注入会出现问题,我想知道是否 你应该使用 总而言之,我认为第二个片段是针对angularjs的旧版本的,但是..

  • 问题内容: 我使用适配器在活动内显示数据,我想在活动内实现,目前,我像往常一样在适配器内进行设置,效果很好。 但是我想在活动中实现它,所以我有更大的控制权。这不符合我的目的。我认为这对我们很多人都是有用的。 问题答案: 您需要在此处查看本教程,以更好地了解如何实现所需的行为。 如果要处理您的活动中的,则需要基于带有接口的回调实现。将接口从活动传递到适配器,然后在单击某些项目时从适配器调用回调函数。

  • 问题内容: 我刚开始学习Go,并通读现有代码以学习“其他人的做法”。在这种情况下,遍历使用go“工作区”,尤其是与项目依赖关系有关的地方。 在处理各种Go项目时,使用一个或多个Go工作区(即$ GOPATH的定义)的常见(或存在)最佳实践是什么?我应该期望有一个类似于我所有项目的中央代码存储库的Go工作区,还是在我处理这些项目时都明确将其分解并设置$ GOPATH(有点像python) virtu