Sewage error: no Iron.Layout, so you cannot use the crop

Using Meteor 0.9.3 and iron: router 1.0.0-pre2, this error is displayed on the console, although iron: layout was installed, see below:

willems-mini:iron willem$ meteor add iron: router@ =1.0.0-pre2 added iron:location at version 1.0.0-pre2 added iron:dynamic-template at version 1.0.0-pre2 added iron:router at version 1.0.0-pre2 added iron:layout at version 1.0.0-pre2 added iron:middleware-stack at version 1.0.0-pre2 added iron:url at version 1.0.0-pre2 added iron:controller at version 1.0.0-pre2 added iron:core at version 1.0.0-pre2 iron:router: Routing specifically designed for Meteor 

There are no other packages, only the default values ​​for the meteor:

 willems-mini:iron willem$ meteor list autopublish 1.0.0 Publish the entire database to all clients insecure 1.0.0 Allow all database writes by default iron:router 1.0.0-pre2 Routing specifically designed for Meteor meteor-platform 1.1.1 Include a standard set of Meteor packages in your app 

I am trying to run a very simple application:

1 javascript file:

 Router.route('/', function () { this.render('home'); }); if (Meteor.isClient) { Template.home.events({ 'click button': function () { console.log('click!'); } }); } 

and 1 html file:

 <head> <title>iron router test</title> </head> <body> {{> defaultLayout}} </body> <template name="defaultLayout"> <header> {{> yield "header"}} </header> <article> {{> yield}} </article> <footer> {{> yield "footer"}} </footer> </template> <template name="home"> {{#contentFor "header"}} <button>click header</button> {{/contentFor}} <button>click</button> {{#contentFor "footer"}} <button>click footer</button> {{/contentFor}} </template> 
+6
source share
2 answers

This is not how iron:router layouts should work.

Get rid of explicit inclusion of the layout in the body:

 {{! this is WRONG, remove the body tag altogether }} <body> {{> defaultLayout}} </body> 

The place where layoutTemplate is specified is in the RouteController :

 Router.route('/', function () { this.render('home'); },{ layoutTemplate:"defaultLayout" }); 

Declaring your RouteController clearly is usually a more pleasing design.

lib/router.js

 Router.route("/",{ // give the route a name so it figures out itself to use : // - HomeController // - a template name "home" name:"home" }); 

lib/controllers/lib/default-layout.js

 DefaultLayoutController=RouteController.extend({ layoutTemplate:"defaultLayout" }); 

lib/controllers/home.js

 HomeController=DefaultLayoutController.extend({ // }); 
+7
source

Well, as in your mistake, you are missing an iron layout.

It might look something like this in your lib/router.js or wherever you save your router code:

 Router.configure({ layoutTemplate: 'layout', loadingTemplate: 'loading' }); 

And therefore, the corresponding <template name="layout"> must be present.

+2
source

Source: https://habr.com/ru/post/976054/


All Articles