Angularjs 那些编译器参数有什么好处_编译器(_element.childNodes,_directiveMap)(_injector,_element.childNodes)

Angularjs 那些编译器参数有什么好处_编译器(_element.childNodes,_directiveMap)(_injector,_element.childNodes),angularjs,dart,angular-dart,Angularjs,Dart,Angular Dart,我需要帮助理解我成功使用的dart代码。 (详细信息:我使用它注入SVG图形,其中包含对变量CSS类的绑定) 我可以在这里调用构造函数参数“注入依赖项”吗 这些参数的内部是什么:this.\u注入器,this.\u编译器,this.\u directiveMap 使用_编译器(…)这些部分是如何协同工作的 我找到了这个解释,但它并没有涵盖整个故事: 守则: @Decorator( selector: '[bindHtml]' ) class BindHtml { static dom

我需要帮助理解我成功使用的dart代码。 (详细信息:我使用它注入SVG图形,其中包含对变量CSS类的绑定)

  • 我可以在这里调用构造函数参数“注入依赖项”吗
  • 这些参数的内部是什么:this.\u注入器,this.\u编译器,this.\u directiveMap
  • 使用_编译器(…)这些部分是如何协同工作的
我找到了这个解释,但它并没有涵盖整个故事:

守则:

@Decorator(
  selector: '[bindHtml]'
)
class BindHtml {
  static dom.NodeValidator validator;

  dom.Element _element;
  Compiler _compiler;
  Injector _injector;
  DirectiveMap _directiveMap;

  BindHtml(this._element, this._injector, this._compiler, this._directiveMap) {
    validator = new AllowAllValidator();
  }

  @NgOneWay('bindHtml')
  set value(value) {
    if(value == null) {
      _element.nodes.clear();
      return;
    }
    String givenHTML = _element.innerHtml;
    value = value+= givenHTML;
    _element.setInnerHtml((value == null ? '' : value.toString()), validator: validator);
    if(value != null) {
      _compiler(_element.childNodes, _directiveMap)(_injector, _element.childNodes);
    }
  }
}

首先,认识到
编译器
视图工厂
的API在AngularDart 0.13.0中发生了变化。看起来您正在使用旧的API,应该改为使用新的API

其次,您的
bindHtml
指令与核心
nginclude
指令非常相似。考虑使用它。< /P> 第三,直接访问
编译器
ViewFactory
被认为是高级用法——您将进入Angular的某些部分,这些部分的API既不非常稳定,也没有很好的文档。我不完全理解您的用例,但很可能有一种方法可以在不访问
编译器的情况下实现您的解决方案

话虽如此,我将深入探讨您的问题:

  • 对。构造函数参数都被注入。您的指令将从依赖项注入系统获取
    编译器
    元素
    等的实例。由于注入系统遵循DOM的结构,因此您将获得定义此
    @Decorator
    元素,但它是一个全局单例
    编译器

    请注意,在0.13.0中,指令(装饰器、组件)将希望注入
    DirectiveInjector
    。该注入器针对指令进行了优化,并为每个DOM节点创建

  • (和3)编译器获取一个DOM节点列表和一个
    DirectiveMap
    ,并生成一个
    ViewFactory
    。它将遍历DOM节点,创建“
    ElementBinder
    s”,其中包含关于在哪些节点上创建哪些指令的说明。此信息存储在同一
    视图的多个实例化上。Angular有一个
    ViewCache
    ,用于避免反复调用
    编译器

    DirectiveMap
    被传入,因此我们可以在应用程序的不同点使用不同的指令。我认为这是一个错误,不应该包含在API中

    ViewFactory
    然后获取一个
    Scope
    、注入器和可选的已经创建的DOM节点,并构建
    视图,该视图是页面上的实际DOM节点。(同样,此API在0.13.0中有更改)


  • 非常感谢。我们现在使用AngularDart 0.12.0。ng include似乎不是我们想要的,因为我们确实从url加载内容,但我们在编译代码并将其注入dom之前对代码进行了增强。还有两个问题:1。_编译器需要_注入器来获取_element.childNodes中的潜在依赖项?“编译器(..)(..)后面的两个括号是如何和为什么?“固有危险”(MHEver于3月19日发表评论)这句话让我有什么好害怕的?我将该代码视为客户端代码,永远不会信任服务器端的输出。这就是为什么我不害怕使用此代码进行代码注入。我应该知道是否存在CSRF漏洞或类似漏洞?两个括号:编译器产生一个视图工厂,即第一个括号。
    ViewFactory
    可以根据需要重复使用以生成
    View
    s。正是
    ViewFactory
    需要
    Injector
    来获取指令实例。-------危险的部分,是的,如果在模板字符串中包含用户输入,则是CSRF/XSRF风险。