<nav-main path="${out.global.url.pathname}" items="${out.global.navigation.main}" />
See Marko Roadmap for the changes in Marko V4
<nav-main path="${out.global.url.pathname}" items="${out.global.navigation.main}" />
See Marko Roadmap for the changes in Marko V4
| // Say lasso what files we want clientside for this layout | |
| // /views/layouts/browser.json | |
| { | |
| "dependencies": [ | |
| { "type":"js", "url":"https://code.jquery.com/jquery-3.1.1.min.js", "external":true}, | |
| { "type":"css", "url":"https://cdn.jsdelivr.net/semantic-ui/2.2.6/semantic.min.css", "external":true }, | |
| { "type":"js", "url":"https://cdn.jsdelivr.net/semantic-ui/2.2.6/semantic.min.js", "external":true }, | |
| "require: ../components/nav-main" | |
| ] | |
| } |
| // /views/components/nav-main/index.marko | |
| <script> | |
| let config = { | |
| caseSensitive: true | |
| }; | |
| /** | |
| * borrowed partially from https://github.com/zimme/meteor-active-route | |
| * Thanks! | |
| */ | |
| let test = function(value, input) { | |
| var result | |
| if ((input === "/" && value === "/")) { | |
| return true | |
| } else if(input === "/") { | |
| return false | |
| } | |
| let pattern = new RegExp(input) | |
| if (value.match(pattern)) { | |
| result = value.search(pattern); | |
| result = result > -1 | |
| } else if (value.search(pattern)) { | |
| if (!config.caseSensitive) { | |
| value = value.toLowerCase() | |
| } | |
| result = value === input | |
| } | |
| return result != null ? result : result = false | |
| } | |
| let isActive = function(input, path) { | |
| return test(input, path) | |
| } | |
| module.exports = { | |
| state: { | |
| path: '/' | |
| }, | |
| onInput(input) { | |
| return { | |
| path: input.path, | |
| items: input.items | |
| } | |
| } | |
| } | |
| </script> | |
| <nav class="ui secondary pointing menu"> | |
| <for(item in data.items)> | |
| <a class="${isActive(data.path, item.path) ? 'active' : ''} item" href="${item.path}"> | |
| ${item.name} | |
| </a> | |
| </for> | |
| <div class="right menu"> | |
| <a class="ui item"> | |
| Logout | |
| </a> | |
| </div> | |
| </nav> |
| <!-- /views/layouts/layout.marko --> | |
| <lasso-page package-path="./browser.json" /> | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <title>My Site</title> | |
| <lasso-head /> | |
| </head> | |
| <body> | |
| <div class="ui container"> | |
| <header> | |
| <!-- | |
| HERE WE USE OUR NAVIGATION COMPONENT | |
| notice the use of global variables from the route middleware | |
| --> | |
| <nav-main path="${out.global.url.pathname}" items="${out.global.navigation.main}" /> | |
| </header> | |
| <main> | |
| <if(data.content)> | |
| <include(data.content) /> | |
| </if> | |
| <else> | |
| <p>no contents</p> | |
| </else> | |
| </main> | |
| </div> | |
| <lasso-body /> | |
| <init-widgets /> | |
| <browser-refresh enabled="true" /> | |
| </body> | |
| </html> |
| // ... | |
| router.use(function (ctx, next) { | |
| // add Url object to global context | |
| ctx.global.url = url.parse(ctx.request.url); | |
| next() | |
| }) | |
| router.use(function(ctx, next) { | |
| // add navigation link config to global context | |
| // navigation config could be loaded from yml file, app config.json or database | |
| ctx.global.navigation = { | |
| main: [ | |
| { | |
| name: 'Home', | |
| path: '/', | |
| children: [] | |
| }, { | |
| name: 'Linkname #1', | |
| path: '/a-path' | |
| }, { | |
| name: 'Linkname #2', | |
| path: '/another-path' | |
| }, { | |
| name: 'Linkname #3', | |
| path: '/a-path/like/this' | |
| } | |
| ] | |
| } | |
| next() | |
| }) | |
| // ... |