是否可以为viewmodels创建一个全局attach()处理程序?

时间:2016-09-08 16:06:56

标签: javascript aurelia

我有一个Aurelia的用例,我希望为每个附加的视图运行一个处理程序。 (这是一个HTML5 polyfill,用于日期和数字输入,可以通过querySelector工作。)我意识到我可以在我创建的每个视图中调用它,但我想知道是否有一个最佳实践来设置它全球水平。 (注意:这可能是通过路由器管道步骤完成的,但所有视图可能都不受此限制,例如通过compose加载的视图。)

我意识到这可能是危险的,但最佳做法是为视图和视图模型添加全局attached()detached()处理程序吗?

编辑:看这里(https://github.com/aurelia/templating/blob/ee5b9d6742fddf3d163aee8face6e6a58ba1554c/src/view.js#L259)看起来好像可以在这里为一个全局处理程序添加一个钩子,它将视图作为参数,但我宁愿不必更改框架代码,如果可能的话。

1 个答案:

答案 0 :(得分:1)

我的想法是创建一个带有attached逻辑的基本viewmodel类,该逻辑包含全局所需的功能。 扩展视图模型可以根据需要调用super.attached()来执行全局逻辑。

您可以在此处找到演示:https://gist.run/?id=fea4069d8a4361c4802c7c5d42105145

这也适用于compose。我知道,它不是一个完全自动化的解决方案,而是一种选择加入方法,所以它需要在所有视图模型上进行一些额外的工作。

基类 - 由所有viewmodels

使用
import { inject } from 'aurelia-framework';

@inject(Element)
export class BaseView {

  constructor(element) {
    this.element = element;
  }

  attached() {
    // global logic goes here
  }

}

示例视图模型 - 实际实现

import { BaseView } from './base-view';
import { inject } from 'aurelia-framework';

@inject(Element)
export class ExtendedView extends BaseView {

  constructor(element) {
    super(element);
  }

  attached() {
    super.attached(); // global logic runs
  }

}