【问题标题】:Angular's exportAs usage difference between ver 2 and 4?Angular 2 版和 4 版之间的 exportAs 使用区别?
【发布时间】:2017-06-18 16:11:05
【问题描述】:

我有一个使用 angular version2 编写的工作 PLNKR
这是一个简单的计时器,其中组件引用了包含逻辑的指令:

@Component({
  selector: 'my-app',
   template: `
    <div>
     <div class="timer" *simpleTimer="#timer=timerApi">       <-- see here
     <div class="time">{{ timer.getTime() }}</div>
      ...
    </div>
  `

在指令本身中 - 它通过以下方式设置 timerApi 的值:

  view.setLocal('timerApi', api);

指令不使用exportAs

@Directive({
  selector: '[simpleTimer]'
})

我想将其转换为 Angular 4。但某些功能不起作用。

例如,以下代码:*simpleTimer="#timer=timerApi" 产生:

解析器错误:[#timer=timerApi] 中的第 1 列中出现意外的标记 #

这个方法view.setLocal 也不存在了。

问题:

如何从组件中引用指令? (所以我将拥有它的所有方法)

我已将exportAs 添加到指令中,但它仍然不起作用。

The problematic Plunker converted to ver 4.2.3

【问题讨论】:

    标签: angular


    【解决方案1】:

    vcRef.createEmbeddedView 的第二个参数需要上下文:

    let api = {
      toggle: () => this.toggle(),
      reset: () => this.reset(),
      getTime: () => this.getTime()
    };
    let view = this.viewContainer.createEmbeddedView(this.templateRef, { timerApi: api });
    

    用法:

    *simpleTimer="let timer = timerApi"
    

    Fixed Plunker v4.2.3

    另一种选择

    let view = this.viewContainer.createEmbeddedView(this.templateRef, { $implicit: api });
    

    和模板

    *simpleTimer="let timer"
    

    Plunker

    【讨论】:

    • 如果 simpletimer 也有 @input 会怎样?这与上面的任务有什么关系?
    • *simpleTimer="inputValue, yurzui: inputValue2, let timer=timerApi;" 表示您的指令有@Input simpleTimer 并且我们将inputValue 传递给它,也有@Input simpleTimerYurzui 并且我们将inputValue2 传递给它
    • 您可以注意到每个后续@Input 的名称来自以下模式simplerTimer + (Y)First character in uppercase + rest characters(urzui)
    • Yuruzi 我必须问你,你从哪里了解到关于指令基本名称的@input 后​​缀?我在文档中没有看到它
    • 所以我的答案是深度调试
    猜你喜欢
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2023-01-05
    • 2016-06-20
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多