angular - 控制属性值的评估

标签 angular

以下代码有效(对任何拼写错误取模——实际代码要复杂得多)。当您单击包含此指令的 DOM 元素时,表达式的值将显示在警报中。

@Directive({selector: '[alertOnClick]'})
export class AlertOnClick implements OnDestroy {
  @Input('alertOnClick') clickFunction: (() => string);

  @HostListener('click')
  onClick() {
    alert(this.clickFunction());
  }
}

问题是,它必须像这样调用:

<button [alertOnClick]="() => String(new Date())">Time</button>

编辑:Angular 解析器似乎不支持匿名函数。它必须通过在 Controller 上命名一个函数来调用。

我想更自然地调用它,像这样:

<button [alertOnClick]="String(new Date())">Time</button>

但是如果有任何类似的变化,每当单击按钮时都会显示相同的时间,即页面呈现的时间。我终生无法弄清楚如何在我喜欢的时候评估表达式,而不是在呈现页面时。有什么建议吗?

最佳答案

有两种可能的方法来创建参数:

  • <button [alertOnClick]="method(new Date())">Time</button>创建 Date在渲染/更改检测期间仅对象一次。

  • <button [alertOnClick]="method(createDate())">Time</button> - 创建Date在每次更改检测 + 实际函数调用时多次对象。

可以使用工厂函数/类型构造函数以受控方式创建参数:<button [alertOnClick]="method(createDate/Date)">Time</button>和里面method会打电话createDate()new date() .可用的解决方案,但不方便。

另一种方法是编写纯自定义 args管道:<button [alertOnClick]="method|args:[Date,new Date()]">Time</button> .此管道创建包装函数,该函数可以在函数调用时创建参数。您可以控制哪些值应该创建一次,哪些应该只在函数调用期间创建。示例:

@Pipe({name: 'args', pure: true})
export class ArgsPipe implements PipeTransform {
  transform(method: Function, parameters: any[]): Function {
    return ()=> {
       const args = parameters.forEach(arg => {
            if(typeof arg === 'function') {
                return arg();
            }
            return arg;
       });
       //todo: figure out how to get correct this
       method.apply(this, args);
    };
  }
}

可能您还需要一个管道来禁用对函数参数的求值,它会将它们转换为 () => functionArgument : <button [alertOnClick]="method|args:[someCallback|func,new Date()]">Time</button> - 在这种情况下 someCallback函数将传递给 method无需调用。

关于angular - 控制属性值的评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47805431/

相关文章:

angular - NGRX 和嵌套关系示例

html - Angular Animations 滑入不起作用,只是出现

javascript - 当作为参数传递给 firebase 动态链接时,Firebase 存储访问 token 被删除

html - 无法访问元素 margin-left

angular - 用户已通过身份验证,但 : "Firebase Storage: User does not have permission to access ' path'"error coming up

angular - 生产构建失败,错误为 “Argument of type ' FormGroup'不能以 Angular react 形式分配给 'NgForm'类型的参数

angular - 如何重新订购 Angular Material 表?

javascript - 如何在新订阅上获取发布到观察者的所有值?

angular - 在 Angular Material 表(mat-table)中混合静态和动态列

javascript - 在 karma 测试中按类名获取两个 div (Angular 4.0)