在Aurelia中动态渲染不同的视图

在Aurelia中动态渲染不同的视图,aurelia,Aurelia,在aurelia中是否有任何方法可以动态渲染不同的视图 async Activate(booking) { //booking: is the route param const hasRecord = await this.service.RecordExists(booking); if (hasRecord) { map(booking,form); } return { //Render differen

在aurelia中是否有任何方法可以动态渲染不同的视图

  async Activate(booking) {
    //booking: is the route param
    const hasRecord = await this.service.RecordExists(booking);
    if (hasRecord) {
            map(booking,form);
    }
    return {
        //Render different template
    }

}

你应该试着用另一种方式来解决这个问题。为什么要导航到ViewModel并触发其创建,只是为了不使用它并加载另一个ViewModel?看起来效率很低,对吧

Aurelia暴露路由器上的管道,您应该在那里执行此检查并相应地重定向。查看预激活步骤,您可以编写类似以下伪代码的代码:

configureRouter(config, router) {
    function step() {
      return step.run;
    }
    step.run = async (navigationInstruction, next) => {
      if(await this.service.RecordExists(navigationInstruction.queryParams...)
      {
         return next()
      } else {
         next.cancel(new Redirect('your other page'))
      }
    };
    config.addPreActivateStep(step)
    config.map([
      { route: ['', 'home'],       name: 'home',       moduleId: 'home/index' },
      { route: 'users',            name: 'users',      moduleId: 'users/index',   nav: true },
      { route: 'users/:id/detail', name: 'userDetail', moduleId: 'users/detail' },
      { route: 'files/*path',       name: 'files',      moduleId: 'files/index',   href:'#files',   nav: true }
    ]);
  }
编辑

在某些情况下,您可能不希望重定向,例如,您有一些用户希望将baseurl/businessobject/id作为书签,并且url在对象实际存在之前是可导航的 然后,您可以在ViewModel上使用getViewStrategy函数:

getViewStrategy(){
    if(this.businessObj){
       return 'existingObjectView.html';     
    } else {
       return 'nonExisting.html';
    }
}

你应该试着用另一种方式来解决这个问题。为什么要导航到ViewModel并触发其创建,只是为了不使用它并加载另一个ViewModel?看起来效率很低,对吧

Aurelia暴露路由器上的管道,您应该在那里执行此检查并相应地重定向。查看预激活步骤,您可以编写类似以下伪代码的代码:

configureRouter(config, router) {
    function step() {
      return step.run;
    }
    step.run = async (navigationInstruction, next) => {
      if(await this.service.RecordExists(navigationInstruction.queryParams...)
      {
         return next()
      } else {
         next.cancel(new Redirect('your other page'))
      }
    };
    config.addPreActivateStep(step)
    config.map([
      { route: ['', 'home'],       name: 'home',       moduleId: 'home/index' },
      { route: 'users',            name: 'users',      moduleId: 'users/index',   nav: true },
      { route: 'users/:id/detail', name: 'userDetail', moduleId: 'users/detail' },
      { route: 'files/*path',       name: 'files',      moduleId: 'files/index',   href:'#files',   nav: true }
    ]);
  }
编辑

在某些情况下,您可能不希望重定向,例如,您有一些用户希望将baseurl/businessobject/id作为书签,并且url在对象实际存在之前是可导航的 然后,您可以在ViewModel上使用getViewStrategy函数:

getViewStrategy(){
    if(this.businessObj){
       return 'existingObjectView.html';     
    } else {
       return 'nonExisting.html';
    }
}

感谢您的回复,查看您的代码。似乎发生了重定向,因此更改了url,这正是我下一步要避免的。取消新重定向“您的另一页”。您能解释一下为什么要避免重定向吗?您可以轻松地使用具有相同viewmodel的两个视图,只需为其提供两条管线即可设置。您可以使用compose元素解决您的问题,但它增加了一些复杂性,我看不到在您的案例中增加的价值,因为用户应该能够将此页面添加到书签中,并且将来此页面可能可用。getViewStrategy在CustomElements中工作吗?这似乎暗示只有compose或router元素可以使用它。事实并非如此,文档是正确的,请参阅:感谢回复,查看您的代码。似乎发生了重定向,因此更改了url,这正是我下一步要避免的。取消新重定向“您的另一页”。您能解释一下为什么要避免重定向吗?您可以轻松地使用具有相同viewmodel的两个视图,只需为其提供两条管线即可设置。您可以使用compose元素解决您的问题,但它增加了一些复杂性,我看不到在您的案例中增加的价值,因为用户应该能够将此页面添加到书签中,并且将来此页面可能可用。getViewStrategy在CustomElements中工作吗?这似乎暗示只有compose或router元素可以使用它。事实并非如此,文档是正确的,请参阅: