Aurelia - Adding a list item username - to the navmenu creates an entry black on black and incorrectly positioned - aurelia

I need to display the name of the user next to the logout option on my navbar. The way I did this was as follows:
<ul class="nav navbar-nav navbar-right">
<li>${userName}</li>
<li repeat.for="row of router.navigation" if.bind="row.settings.pos == 'right'" class="${ row.isActive ? 'link-active' : '' }">
<a href.bind="row.href" if.bind="!row.settings.nav">${ row.title }</a>
I thought that if I added another list item it in the nav navbar-nav it would display as all the other menu items do. Instead I got:
I have highlighted the name admin as, if I didnt it would be black on black. Its not receiving the correct styling as the other menu items have.
How do I render the admin list item so it displays like all the other list items?
EDIT
Looking at the question it was pointed out it was light on on background. It was late at night.
Yes I am using bootstrap version 3.
Here is the full html of the navbar view model:
<template>
<require from="./navmenu.css"></require>
<div class="main-nav">
<div class="navbar navbar-inverse">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<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="#/home">Jobsledger</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-left">
<li repeat.for="row of routes" if.bind="row.settings.pos == 'left'" class="${ row.isActive ? 'link-active' : '' }">
<a href.bind="row.href" if.bind="!row.settings.nav">${ row.title }</a>
<a href.bind="row.href" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"
if.bind="row.settings.nav">
${row.title}
<span class="caret"></span>
</a>
<ul if.bind="row.settings.nav" class="dropdown-menu">
<li repeat.for="menu of row.settings.nav">
<a href.bind="menu.href">${menu.title}</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>${userName}</li> //HERE - THIS LINE DOESNT RENDER PROPERLY.
<li repeat.for="row of routes" if.bind="row.settings.pos == 'right'" class="${ row.isActive ? 'link-active' : '' }">
<a href.bind="row.href" if.bind="!row.settings.nav">${ row.title }</a>
<a href.bind="row.href" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"
if.bind="row.settings.nav">
${row.title}
<span class="caret"></span>
</a>
<ul if.bind="row.settings.nav" class="dropdown-menu">
<li repeat.for="menu of row.settings.nav">
<a href.bind="menu.href">${menu.title}</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
${userName}
</template>
Here is the typescript file behind it:
import { autoinject, bindable, bindingMode } from "aurelia-framework";
import { Router } from 'aurelia-router'
import { AuthService } from '../../auth/auth-service'
#autoinject
export class Navmenu {
public userName: string = 'anonymous';
private userRole = localStorage.getItem("user_role");
constructor(public authService: AuthService, public router: Router) {
this.userName = authService.getUserName();
}
get routes() {
return this.router.navigation.filter(r => r.settings.roles.indexOf(this.userRole) > -1);
}
}
I wanted to separate the left menu items with the right menu items so there are two sections. This is the right side where you have the user name and the option to logout. The display of the user name is done as a list item in the unordered list tag but before repeat for the right menu items.

Related

How to create NavMenu with collapsible submenu in .Net Core Blazor app

I am trying to create a blazor navmenu which has a shape like this
item a
item b
when I click on item b it expands with sub menu like this and clicking on subitems, new pages open
item a
item b
subitem 1
subitem 2
I just edited the original blazor app but no success. The button appears but it doesn't collapse submenu. any idea?
<div class="#NavMenuCssClass" #onclick="#ToggleNavMenu">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch Data
</NavLink>
</li>
<li class="dropdown">
<button data-toggle="collapse" data-target="#demo">Collapsible</button>
<div id="demo" class="collapse">
<ul>
<li class="nav-item px-3">
<NavLink class="nav-link" href="meeting">
<span class="oi oi-plus" aria-hidden="true"></span> Meetings
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="conference">
<span class="oi oi-list-rich" aria-hidden="true"></span> Conferences
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="event">
<span class="oi oi-list-rich" aria-hidden="true"></span> Events
</NavLink>
</li>
</ul>
</div>
</li>
</ul>
Do not use the data-toggle and data-target for it.
These are used by boostrap.js however you do not want to modify the DOM in that way.
What you do instead is to use an if statement and thus let Blazor take care of the rendering:
<NavLink class="nav-link" #onclick="()=>expandSubNav = !expandSubNav">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</NavLink>
#if (expandSubNav)
{
<NavLink class="expand-menu" href="">
<span>Sub1</span>
</NavLink>
<NavLink class="" href="">
<span>Sub2</span>
</NavLink>
}
And put the expandSubNav field into your code section:
#code {
private bool expandSubNav;
}
You can try this solution if you have more submenus
<div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">System</a>
<button class="navbar-toggler" #onclick="() => ToggleNavMenu(navSubmenu)">
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class="#NavMenuCssClass">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" #onclick="() => ToggleNavMenu(NavSubmenu.None)" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" #onclick="() => TogleSubmenu(NavSubmenu.First)">
<span class="oi oi-list-rich" aria-hidden="true"></span> Submenu 1
</NavLink>
</li>
#if (navSubmenu == NavSubmenu.First)
{
<li class="nav-item px-5">
<NavLink class="nav-link" #onclick="() => ToggleNavMenu()" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</li>
<li class="nav-item px-5">
<NavLink class="nav-link" #onclick="() => ToggleNavMenu()" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch Data
</NavLink>
</li>
}
<li class="nav-item px-3">
<NavLink class="nav-link" #onclick="() => TogleSubmenu(NavSubmenu.Second)">
<span class="oi oi-list-rich" aria-hidden="true"></span> Submenu 2
</NavLink>
</li>
#if (navSubmenu == NavSubmenu.Second)
{
<li class="nav-item px-5">
<NavLink class="nav-link" #onclick="() => ToggleNavMenu()" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</li>
<li class="nav-item px-5">
<NavLink class="nav-link" #onclick="() => ToggleNavMenu()" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch Data
</NavLink>
</li>
}
</ul>
</div>
#code {
private enum NavSubmenu
{
None,
First,
Second
}
private string NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private NavSubmenu navSubmenu = NavSubmenu.None;
private bool collapseNavMenu = true;
private void ToggleNavMenu(NavSubmenu? submenu = null)
{
collapseNavMenu = !collapseNavMenu;
navSubmenu = submenu ?? navSubmenu;
}
private void TogleSubmenu(NavSubmenu submenu)
{
if (navSubmenu == submenu)
navSubmenu = NavSubmenu.None;
else
navSubmenu = submenu;
}
}
<div class="nav-link" #onclick="()=>expandSubNav = !expandSubNav">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</div>
#if (expandSubNav)
{
<NavLink class="expand-menu" href="">
<span>Sub1</span>
</NavLink>
<NavLink class="" href="">
<span>Sub2</span>
</NavLink>
}
use div instead of NAVLINK. Navlink reloads the page and reset the expandSubNav.
My Solution, after problems with not closing on click the submenu:
works on Mobile:
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" href="">MyPrgramm</a>
<button class="navbar-toggler" type="button" #onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
<div class="#NavMenuCssClass" #onclick="ToggleNavMenu">
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<NavLink class="nav-link text-dark" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link text-dark" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Menu-II
</NavLink>
</li>
<li class="nav-item dropdown show">
<NavLink class="nav-link dropdown-toggle" #onclick="() => expandSubNavSettings = !expandSubNavSettings" id="navbarDropdown" >
<span class="oi oi-list-rich" aria-hidden="true"></span> Menu III
</NavLink>
#if (expandSubNavSettings)
{
<li class="dropdown-menu show" aria-labelledby="navbarDropdown" #onclick="() => expandSubNavSettings = !expandSubNavSettings">
<li class="nav-item">
<NavLink class="nav-link text-dark" href="fetchdata">
<span class="oi oi-fork" aria-hidden="true"></span> Fetch
</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link text-dark" href="counter">
<span class="oi oi-command" aria-hidden="true"></span> Counter
</NavLink>
</li>
<li class="nav-item">
<NavLink class="nav-link text-dark" href="home">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
</li>
}
</li>
</ul>
</div>
</div>
</nav>
#code {
bool collapseNavMenu = true;
private bool expandSubNavSettings;
string baseMenuClass = "navbar-collapse d-sm-inline-flex flex-sm-row-reverse";
string NavMenuCssClass => baseMenuClass + (collapseNavMenu ? " collapse" : "");
void ToggleNavMenu()
{
if(!expandSubNavSettings)
{
collapseNavMenu = !collapseNavMenu;
}
}
}
(End result) I struggled quite a bit with submenus and ended up using this in my project:
<div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">Submenu master</a>
<button class="navbar-toggler" #onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class="#NavMenuCssClass">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" #onclick="()=>ToggleNavMenu()" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" #onclick="()=>ToggleSubmenu()">
<span class="oi oi-menu" aria-hidden="true"></span> Menu
</NavLink>
</li>
#if (expandMenu)
{
<li class="nav-item px-4" #onclick="ToggleNavMenu">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</li>
<li class="nav-item px-4" #onclick="ToggleNavMenu">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</NavLink>
</li>
}
</ul>
</div>
#code {
private bool collapseNavMenu = true;
private string NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private bool expandMenu;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
expandMenu = false;
}
private void ToggleSubmenu()
{
expandMenu = !expandMenu;
}
}
Implement Sub-menu by using Bootstrap
Default template of Blazor generate collapse class inside #media in NavMenu.razor.css which interferes with Bootstrap's submenu collapse so we need to rename it to something else.
/* NavMenu.razor.css */
/* Add */
.sidebar-collapse {
display: none;
}
/* Modify */
#media (min-width: 641px) {
...
.sidebar-collapse {
/* Never collapse the sidebar for wide screens */
display: block;
}
}
On NavMenu.razor replace the same class name inside code block
/* NavMenu.razor */
private string? NavMenuCssClass => collapseNavMenu ? "sidebar-collapse" : null;
Remove #onclick="ToggleNavMenu" from nav parent div
<div class="#NavMenuCssClass">
<nav class="flex-column">
...
</nav>
</div>
Add Sub-Menu Items.
Classes has-submenu, nav-submenu and nav-subitem are optional but will be used for styling later
<div class="nav-item has-submenu px-3">
<NavLink class="nav-link collapsed" href="#" data-toggle="collapse" data-target="#userSubMenu"> <!-- <= this id -->
<span class="oi oi-list-rich" aria-hidden="true"></span> Users
</NavLink>
<ul class="nav-submenu collapse list-unstyled" id="userSubMenu"> <!-- <= and this id must match -->
<li class="nav-subitem">
<NavLink href="users/add">
<span class="oi oi-plus" aria-hidden="true"></span> Add
</NavLink>
</li>
<li class="nav-subitem">
<NavLink href="users/list">
<span class="oi oi-people" aria-hidden="true"></span> View
</NavLink>
</li>
</ul>
</div>
Bootstrap 4.x
Add js files in index.html
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
Bootstrap 5.x
Add js files in index.html
<script src="https://cdn.jsdelivr.net/npm/bootstrap#5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
On NavLink Replace data-toggle with data-bs-toggle and data-target with data-bs-target
Sub-menu should be working now.
Additional Styling
Add these styles to NavMenu.razor.css
/* Custom Styles */
.nav-item ::deep .nav-link i {
width: 2rem;
font-size: 1.1rem;
}
::deep .nav-item.has-submenu > a {
position: relative;
}
::deep .nav-item.has-submenu > a:after {
content: "\e02f";
position: absolute;
right: 15px;
color: white;
font-family: "Icons";
font-weight: 400;
font-size: 13px;
transform: rotateZ(90deg);
transform-origin: left;
transition: transform .5s ease;
}
::deep .nav-item.has-submenu > a.collapsed:after {
transform: rotateZ(0deg);
}
.nav-item ::deep .nav-submenu .nav-subitem a {
padding-left: 3rem;
text-decoration: none;
}
.nav-item ::deep .nav-submenu .nav-subitem a i {
width: 2rem;
font-size: 1.1rem;
}
If you would like to have perfect look of sub menu items, here is the example:
<li class="nav-item px-3">
<NavLink class="nav-link" href="cart" #onclick="()=>expandSubMenu= !expandSubMenu">
<span class="oi oi-cart" aria-hidden="true"></span> Cart
</NavLink>
#if (expandSubMenu)
{
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="cart/1">
<span class="oi oi-file" aria-hidden="true"></span> Sub-1
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="cart/2">
<span class="oi oi-bar-chart" aria-hidden="true"></span> Sub-1
</NavLink>
</li>
</ul>
}
</li>
you also need to add expandSubMenu property to the code block
#code {
private bool collapseNavMenu = true;
private bool expandSubMenu;//add
private string NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}
I tried with the same css class available in nav menu and made the submenu looks better.
<div class="#NavMenuCssClass" #onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" #onclick="()=>expandSubNav=!expandSubNav">
<span class="oi oi-plus" aria-hidden="true"></span>Admin
</NavLink>
#if (expandSubNav)
{
<div class="nav-item px-3">
<NavLink class="nav-link" href="device">
<span class="oi oi-arrow-circle-right"></span>Sub-menu 1
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-arrow-circle-right"></span>Sub-menu 2
</NavLink>
</div>
}
</div>
</nav>
#code {
private bool collapseNavMenu = true;
private bool expandSubNav = false;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}
I took a approach with jQuery and also made the menu responsive :
A complete sample can be downloaded from here
I was not happy with the solutions so after a lot of thinking I came up with the following one. This does work on normal browser and mobile.
For browser:
Submenu only collapse after a click on it.
Submenu collapse after the click on the title (Webassembly).
Submenus did not collapse if some other sections are clicked.
For mobile:
Page starts with Navmenu collapsed
Submenu only collapses after click on it.
Navmenu did collapse after selection (if not the submenu is collapsed by it)
Navmenu collapses after click on the title (Webassembly).
The trick was to remove the NavMenuToggle in the <div class="#NavMenuCssClass nav-scrollable ..."> element to get more control over the each element inside the div. I also changed some of the variables to make more sense for me.
Here is the full code:
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid" #onclick="CloseEveryMenu">
<a class="navbar-brand" href="">WebAssembly</a>
<button title="Navigation menu" class="navbar-toggler">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</div>
<div class="#NavMenuCssClassCollapse nav-scrollable">
<nav class="flex-column">
<div class="nav-item px-3" #onclick="ToggleNavMenu">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3" #onclick="ToggleNavMenu">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" #onclick="ToggleSubMenu">
<span class="oi" aria-hidden="true">Configuration</span>
</NavLink>
#if (subMenuExpanded)
{
<div class="nav-item px-3" #onclick="CloseNavMenu">
<NavLink class="nav-link" href="#">
<span class="oi oi-arrow-circle-right"></span>Sub-menu 1
</NavLink>
</div>
<div class="nav-item px-3" #onclick="CloseNavMenu">
<NavLink class="nav-link" href="#">
<span class="oi oi-arrow-circle-right"></span>Sub-menu 2
</NavLink>
</div>
}
</div>
<div class="nav-item px-3" #onclick="ToggleNavMenu">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</NavLink>
</div>
</nav>
</div>
#code {
private bool navMenuExpanded = false;
private bool subMenuExpanded = false;
private string? NavMenuCssClassCollapse => navMenuExpanded ? null : "collapse";
private void ToggleNavMenu() => navMenuExpanded = !navMenuExpanded;
private void ToggleSubMenu() => subMenuExpanded = !subMenuExpanded;
private void CloseNavMenu() => navMenuExpanded = false;
private void CloseSubMenu() => subMenuExpanded = false;
private void CloseEveryMenu()
{
CloseSubMenu();
ToggleNavMenu();
}
}
Please don't forget to upvote the question (and the answer if you like it)!

VueJS: Dropdown on navbar doesn't work while navigate to other page

I have a Vue single-page-apps about a simple online bookstore. This project so far runs well except a tiny issue: When a login customer clicks 'logout' link on navbar, the system navigates him to the frontpage and 'logout' link becomes a 'register/login' link. This link should be a dropdown, but after navigating, this link doesn't work(no respond while clicking it) anymore until press F5 to reload the page from 'server'. Following is my navbar.vue
<template>
...
<!---Good Dropdown--->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownShowMenuLink"
role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
Showroom
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownShowMenuLink">
<router-link class="dropdown-item" to="/showBookList/newAddings">By Updates</router-link>
<router-link class="dropdown-item" to="/showBookList/authors">By Authors</router-link>
<router-link class="dropdown-item" to="/showBookList/categories">By Categories</router-link>
</div>
</li>
<template v-if="isLogin">
<li class="nav-item">
<a class="nav-link" id="logoutLink" href="javascript:void(0)" #click="logout">logout</a>
</li>
<template v-if="isAdmin">
<li class="nav-item">
<router-link class="nav-link" to="/admin">Dashboard</router-link>
</li>
</template>
</template>
<template v-else>
<!--Bad dropdown-->
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="javascript:void(0)" id="navbarDropdownUserMenuLink"
role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
Login/Register</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownUserMenuLink">
<router-link class="dropdown-item" to="/loginForm">Sign In</router-link>
<router-link class="dropdown-item" to="/registerForm">Sign Up</router-link>
</div>
</li>
</template>
...
</template>
<script>
import configs from '#/configs'
export default{
...
methods{
async logout(){
let logoutURL = configs.serverURL + configs.serverPort + '/logout';
await this.$store.dispatch('logout', {logoutURL});
alert(this.$store.getters.currentMsg);
this.$router.push('/');
},
},
...
}
</script>
I figured out a simple way to work around:
use v-show rather than v-if to render bootstrap dropdown.
<li v-show="!isLogin" class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdownUserMenuLink"
role="button" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
Login/Register</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownUserMenuLink">
<router-link class="dropdown-item" to="/loginForm">Sign In</router-link>
<router-link class="dropdown-item" to="/registerForm">Sign Up</router-link>
</div>
</li>
According to guidline of Vue2:
v-if is “real” conditional rendering because it ensures that event listeners and child components inside the conditional block are properly destroyed and re-created during toggles. In comparison, v-show is much simpler - the element is always rendered regardless of initial condition, with CSS-based toggling.
I think sth wrong while re-creating "dropdown". Maybe someone can help me to figure out how to use "v-if".

How to change the glyphicon on click event?

I am trying to change glyphicon on click event. From console I found out that classes are not set properly.
From Inspect Element
<span _ngcontent-c2="" class="glyphicon-menu-up" ng-reflect-klass="glyphicon glyphicon-menu-up ar" ng-reflect-ng-class="[object Object]"></span>
This is the code I did in HTML part.
CODE:
<ul class="nav third-nav">
<li appExpandMenu (click)="isCollapsedA=!isCollapsedA">
<a>
<span [ngClass] = "{'glyphicon glyphicon-menu-up arrow': !isCollapsedA, 'glyphicon glyphicon-menu-right arrow': isCollapsedA}" class="glyphicon glyphicon-menu-{{sign}} arrow"></span>
<span class="third-menu-title">Docs</span>
</a>
</li>
<ul class="nav third-nav">
<li appExpandMenu (click)="isCollapsedA=!isCollapsedA">
<a>
<span [ngClass] = "{'glyphicon glyphicon-menu-up arrow': !isCollapsedA, 'glyphicon glyphicon-menu-right arrow': isCollapsedA}" class="glyphicon glyphicon-menu-{{sign}} arrow"></span>
<span class="third-menu-title">Docs</span>
</a>
</li>
you should apply [ngClass] like this:
[ngClass] ="isCollapsedA ? 'glyphicon glyphicon-menu-right arrow' : 'glyphicon glyphicon-menu-up arrow'"
This is perhaps the code you need .
https://stackblitz.com/edit/angular-ngclass-u5bzma?file=app%2Fapp.component.html

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>Login</li>
</ul>
<ul if.bind="isAuthenticated" class="nav navbar-nav navbar-right">
<li>Profile</li>
<li>Logout</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>
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>

How can i set menu to top of the page after scrolling down 500 px

I use bootstrap ver 3.
When I'm scrolling down, I want my menu bar set to top of the page.
screenshot:
My start page when loading show my logo in center & my menu bar in bottom of logo.
Height of page 500px
my menu cod:
<div class="navbar-inverse navbar-default navbar-static-top" role="navigation" > <!-- منو بالا -->
<div class="container my-menubar">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active">صفحه اصلی</li>
<li>محصولات</li>
<li>درباره ما</li>
<li class="dropdown "> خدمات <span class="caret"></span>
<ul class="dropdown-menu my-menubar" role="menu">
<li>خدمات 1</li>
<li>خدمات 2</li>
<li>خدمات 3</li>
<li class="divider"></li>
<li class="dropdown-header">Nav header</li>
<li>Separated link</li>
<li>One more separated link</li>
</ul>
</li>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /container -->
</div>
please watch below link :
http://chuckagency.com/wordpress-new/
i want create like this.
Add two attributes below class
.navbar-static-top {
top: 0px;
position: fixed;
}
You can use some javascript like the below to add a class to your menu once you have scrolled down enough.
var listval = $('.section-nav-bar-menu')[0].offsetTop;
$(document).scroll(function() {
var topval = $(document).scrollTop();
if(topval >= listval){
$('.section-nav-bar-menu').addClass('fixed');
} else {
$('.section-nav-bar-menu').removeClass('fixed');
}
});
});
Then you can use CSS to fix the menu bar to the top of the page using the "fixed" class.
There are probably many different implementation of this code, so look around and see what works best for you...
$(window).scroll(function () {
if ($(window).scrollTop() >= 450) {
if ($('.navbar-default').hasClass('navbar-static-top')){
$('.navbar-default').removeClass('navbar-static-top');
$('.navbar-default').addClass('navbar-fixed-top');
}
}
else {
if ($('.navbar-default').hasClass('navbar-fixed-top')){
$('.navbar-default').addClass('navbar-static-top');
$('.navbar-default').removeClass('navbar-fixed-top');
}
}
});