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