Search code examples
aureliaaurelia-auth

Aurelia nav-bar VM Not Working


I followed the examples for setting up a nav-bar.html and a nav-bar.js in the Aurelia tutorial. Later, I wanted to add some functionality to the nav-bar.js VM but found that non of it's properties or methods are ever called.

I'm trying to use Aurelia Auth filtering on my top navigation, but even when omitting the auth functionality, nothing in top-nav-bar.js is ever called.

Code below:

top-nav-bar.js

import {bindable} from 'aurelia-framework';
import {inject} from 'aurelia-framework';
import {AuthService} from 'aurelia-auth';
//import {AuthFilterValueConverter} from './authFilter';
//import {Router} from 'aurelia-router';
@inject(AuthService )
export class TopNavBar {
  _isAuthenticated=false;
  @bindable router = null;

  constructor(auth){
    console.log('called nav bar constructor'); //NEVER CALLED
    this.auth = auth;

  }
  //@computedFrom(this.auth)
  get isAuthenticated(){
    return this.auth.isAuthenticated(); //NEVER CALLED
  }
}

top-nav-bar.html

    <template>
  <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
  <!-- <require from="paulvanbladel/aurelia-auth"></require> -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="sr-only">Toggle Navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">
        <i class="fa fa-home"></i>
        <span>${router.title}</span>
      </a>
    </div>

    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li repeat.for="row of router.navigation | authFilter: isAuthenticated" class="${row.isActive ? 'active' : ''}">
          <a data-toggle="collapse" data-target="#bs-example-navbar-collapse-1.in" href.bind="row.href">${row.title}</a>
        </li>
      </ul>

      <ul if.bind="!isAuthenticated" class="nav navbar-nav navbar-right">
      <li><a href="/#/login">Login</a></li>
      </ul>
      <ul if.bind="isAuthenticated" class="nav navbar-nav navbar-right">
        <li><a href="/#/profile">Profile</a></li>
        <li><a href="/#/logout">Logout</a></li>
      </ul>

      <ul class="nav navbar-nav navbar-right">
        <li class="loader" if.bind="router.isNavigating">
          <i class="fa fa-spinner fa-spin fa-2x"></i>
        </li>
      </ul>
    </div>
  </nav>
</template>

app.html

<template>
  <require from="./top-nav-bar.html"></require>
  <require from="bootstrap/css/bootstrap.css"></require>

  <top-nav-bar router.bind="router"></top-nav-bar>

  <div class="page-host">
    <router-view></router-view>
  </div>
</template>

Solution

  • If you have aurelia VM with js and html you need to import it to the view like (without *.html):

     <require from="./top-nav-bar"></require>
    

    Sometimes you do not have VM for the view, in that case you import just the html, like you do:

     <require from="./top-nav-bar.html"></require>