Reusing an Existing View Model

To be clear

export const determineActivationStrategy = (
  currentNavInstruction: NavigationInstruction,
  prevViewPortInstruction: ViewPortInstruction,
  newViewPortConfig: RouteConfig | ViewPortInstruction,
  // indicates whether there is difference between old and new url params
  hasNewParams: boolean,
  forceLifecycleMinimum?: boolean
): ActivationStrategyType => {

  let newInstructionConfig = currentNavInstruction.config;
  let prevViewPortViewModel = prevViewPortInstruction.component.viewModel;
  let viewPortPlanStrategy: ActivationStrategyType;

  if (prevViewPortInstruction.moduleId !== newViewPortConfig.moduleId) {
// different view-model, use "replace".
    viewPortPlanStrategy = InternalActivationStrategy.Replace;
  } else if ('determineActivationStrategy' in prevViewPortViewModel) {
// when you defined determineActivationStrategy() in view-model
    viewPortPlanStrategy = prevViewPortViewModel.determineActivationStrategy(...currentNavInstruction.lifecycleArgs);
  } else if (newInstructionConfig.activationStrategy) {
// when you define activationStrategy in route config like
// { route: ..., moduleId: ..., activationStrategy: 'replace'}
    viewPortPlanStrategy = newInstructionConfig.activationStrategy;
  } else if (hasNewParams || forceLifecycleMinimum) {
// when you navigate from product/a to product/b for a route defined
// with params like product/:id
// use invoke-lifecycle
    viewPortPlanStrategy = InternalActivationStrategy.InvokeLifecycle;
  } else {
// default to no-change
    viewPortPlanStrategy = InternalActivationStrategy.NoChange;
  }
  return viewPortPlanStrategy;
};
1 Like