【发布时间】:2016-11-25 06:57:07
【问题描述】:
当导出一个在 aurelia 中充当视图模型的 es6 类时,我似乎能够在构造函数和激活函数中设置初始化代码。
这里有什么标准约定吗?
我应该在其中一个而不是另一个中进行某些初始化吗?
对于没有实现 es6 类的用户有激活功能吗?
【问题讨论】:
标签: javascript constructor aurelia
当导出一个在 aurelia 中充当视图模型的 es6 类时,我似乎能够在构造函数和激活函数中设置初始化代码。
这里有什么标准约定吗?
我应该在其中一个而不是另一个中进行某些初始化吗?
对于没有实现 es6 类的用户有激活功能吗?
【问题讨论】:
标签: javascript constructor aurelia
您可以在构造函数和激活方法中设置实例属性,它们都将被 Aurelia 调用。但是,这里存在某种概念上的差异。
Activate 是屏幕激活生命周期方法之一,理想情况下应仅用于控制屏幕/视图模型行为。例如,canDeactivate 方法控制是否可以导航到视图模型等。激活也是一个钩子,它在视图模型被渲染之前执行(但在 attached 钩子之前)。然而,activate 方法可能永远不会被调用,比如路由在构造函数中导航离开,或者canActivate 方法拒绝/返回 false - 在这种情况下仍会调用构造,但不会调用 activate。
另一方面,construct 方法在任何其他钩子和方法之前被调用,所以它在activate 之前被调用。出于这个原因,construct 是设置配置属性的主要位置,因为它需要依赖注入。因此虽然 activate 需要一组固定的参数(params、routeConfig、navigationInstruction),但传递给 constructor 方法的参数列表取决于您注入视图模型类的服务。
【讨论】:
我在这里看到的一个很大的不同是 activate 方法有一个 Promis 作为返回值,所以你可以在这里运行异步代码。在构造函数中触发异步代码是一个非常糟糕的主意。进一步的细节是构造函数不能抛出异常,所以通常在这里你只需将构造函数参数分配给没有任何逻辑的局部变量。我不会在构造函数中做更多的事情,使用逻辑的实际视图模型初始化应该发生在 activate 或 attached 方法中。
【讨论】: