Angular 什么是渲染器适配器?

Angular 什么是渲染器适配器?,angular,ng-bootstrap,Angular,Ng Bootstrap,虽然我无法重现这个问题,但请看一下我的 尝试在本地工作区中打开对话框时收到以下错误: ERROR TypeError: this._renderer.setProperty is not a function at NgbRadio.set [as value] (radio.js:133) at updateProp (core.es5.js:11160) at checkAndUpdateDirectiveInline (core.es5.js:10852) at checkAndUpdat

虽然我无法重现这个问题,但请看一下我的

尝试在本地工作区中打开对话框时收到以下错误:

ERROR TypeError: this._renderer.setProperty is not a function
at NgbRadio.set [as value] (radio.js:133)
at updateProp (core.es5.js:11160)
at checkAndUpdateDirectiveInline (core.es5.js:10852)
at checkAndUpdateNodeInline (core.es5.js:12382)
at checkAndUpdateNode (core.es5.js:12321)
at debugCheckAndUpdateNode (core.es5.js:13180)
at debugCheckDirectivesFn (core.es5.js:13121)
at Object.eval [as updateDirectives] (AdEditorComponent.html:48)
at Object.debugUpdateDirectives [as updateDirectives] (core.es5.js:13106)
at checkAndUpdateView (core.es5.js:12288)
我测试了许多较小的案例,然后发现RenderAdapter在NgbRadio组件中包含了有效的Debugger2实例

因此,我对Ngbadio和Ngbativelabel的构造函数编写了一个黑客程序进行测试,然后应用程序运行良好:

this._renderer = _renderer.constructor.name === 'RendererAdapter'? _renderer.delegate: _renderer;
模板中的此结构会产生错误:

<div [ngSwitch]="conditionalProperty">
  <my-component *ngSwitchCase="'case1'" ...></my-component>
  <my-another-comp *ngSwitchCase="'case2'" ...></my-another-comp>
</div>

让我列出对话框可以在我的本地计算机中打开的两种情况:

  • 不要在模板的components has ngSwitchCase属性中插入任何管道依赖项(他们不关心管道是我的自定义的或从@angular/common提供的)
  • ngSwitch div中只有一个组件(但可能包含其他具有ngSwitchCase的普通div)
我测试了最新版本的Chrome、Safari和Firefox,我的angular版本是4.2.4

我在Google上找不到任何关于RenderAdapter的有用文章。
我可能会用上面的黑客来解决这个问题,但我不想忽视真正的问题是什么。如果有任何答案,我将不胜感激。

现在的默认渲染器是。因此,将渲染器注入组件时,应使用
Renderer2
标记:

class MyComponent {
   constructor(renderer: Renderer2)
但是,使用了Angular的早期版本,该版本现在已被弃用,为了将其注入
渲染器
令牌:

class MyComponent {
   constructor(renderer: Renderer)
renderAdapter
是一个将旧API映射到新API的类,例如,第一个渲染器具有
listenGlobal
方法,而后一个API使用
listen
。以下是此特定方法的映射:

  listenGlobal(target: string, name: string, callback: Function): Function {
      return this.delegate.listen(target, name, <any>callback);
  }
listenGlobal(目标:字符串,名称:字符串,回调:函数):函数{
返回此.delegate.listen(目标,名称

另见


现在的默认呈现程序是。因此,当您将呈现程序注入组件时,应使用
Renderer2
令牌:

class MyComponent {
   constructor(renderer: Renderer2)
但是,使用了Angular的早期版本,该版本现在已被弃用,为了将其注入
渲染器
令牌:

class MyComponent {
   constructor(renderer: Renderer)
renderAdapter
是一个将旧API映射到新API的类,例如,第一个渲染器具有
listenGlobal
方法,而后一个API使用
listen
。下面是此特定方法的映射:

  listenGlobal(target: string, name: string, callback: Function): Function {
      return this.delegate.listen(target, name, <any>callback);
  }
listenGlobal(目标:字符串,名称:字符串,回调:函数):函数{
返回此.delegate.listen(目标,名称

另见


它看起来很奇怪。我没有使用渲染器注入,并且我的本地版本中的ng引导也是最新版本,因此Ngb组件明确要求Renderer2。但是DI提供了旧的渲染器。谢谢你的回答。我会关注这些angular的问题。它看起来很奇怪。我没有使用渲染器注入,我的本地版本中的ng引导也是最新版本n、 所以Ngb组件明确要求Render2。但是DI提供了旧的渲染器。谢谢你的回答。我将关注这些问题。