2017-02-22 21 views
0

Я работаю с keystone.js в проекте. И я делаю Templating с Handlebars (hbs) Что я хочу делать: На моей индексной странице я хочу отобразить слайдер (решил это с помощью unlider.js, поэтому мне нужно только отображать изображения и текст из слайдерной модели) и 3 новых события (это работает). Вот мой код до сих пор:keystone.js: как я могу отображать контент из 2 разных моделей на моей индексной странице

Это мое событие Модель

var keystone = require('keystone'); 
var Types = keystone.Field.Types; 

/** 
* Event Model 
* ========== 
*/ 

var Event = new keystone.List('Event', { 
    map: { name: 'title' }, 
    autokey: { path: 'slug', from: 'title', unique: true }, 
}); 

Event.add({ 
    title: { type: String, required: true }, 
    state: { type: Types.Select, options: 'draft, published, archived', default: 'draft', index: true }, 
    author: { type: Types.Relationship, ref: 'User', index: true }, 
    publishedDate: { type: Types.Date, index: true, dependsOn: { state: 'published' } }, 
    image: { type: Types.CloudinaryImage }, 
    content: { 
     brief: { type: Types.Html, wysiwyg: true, height: 150 }, 
     extended: { type: Types.Html, wysiwyg: true, height: 400 }, 
    }, 
    eventcategories: { type: Types.Relationship, ref: 'EventCategory', many: true }, 
}); 

Event.schema.virtual('content.full').get(function() { 
    return this.content.extended || this.content.brief; 
}); 

Event.defaultColumns = 'title, state|20%, author|20%, publishedDate|20%'; 
Event.register(); 

И это мой слайдер Модель

var keystone = require('keystone'); 
var Types = keystone.Field.Types; 

/** 
* slider Model 
* ========== 
*/ 

var Slider = new keystone.List('Slider', { 
    map: { name: 'title' }, 
    autokey: { path: 'slug', from: 'title', unique: true }, 
}); 

Slider.add({ 
    title: { type: String, required: true }, 
    image: { type: Types.CloudinaryImage }, 
}); 

Slider.register(); 

Обе модели работают корректно в серверной, и это должно быть проблемой только в представлении ... поэтому вот индексный индекс

var keystone = require('keystone'); 

exports = module.exports = function (req, res) { 

    var view = new keystone.View(req, res); 


    var locals = res.locals; 

    // Init locals 
    locals.section = 'eventblog'; 
    locals.filters = { 
     eventcategory: req.params.category, 
    }; 


    // Set locals 
    locals.section = 'slider'; 
    locals.data = { 
     titles: [], //maybe this is a problem? 
     images: [], //maybe this is a problem? 
     events: [], 
     eventcategories: [], 
    } 


    // locals.section is used to set the currently selected 
    // item in the header navigation. 
    locals.section = 'home'; 

    view.on('init', function (next) { 

     var q = keystone.list('Event').paginate({ 
      page: req.query.page || 1, 
      perPage: 3, 
      maxPages: 1, 
      filters: { 
       state: 'published', 
      }, 
     }) 
      .sort('-publishedDate') 
      .populate('author categories'); 

     if (locals.data.eventcategory) { 
      q.where('categories').in([locals.data.eventcategory]); 
     } 


     q.exec(function (err, results) { 
      locals.data.events = results; 
      next(err); 
     }); 

    }); 










    // Render the view 
    view.render('index'); 
}; 

И вот мой index.hbs

<div class="container"> 


    <div class="my-slider"> 
     <ul> 

      {{#each slider}} 
       <!-- doesn't loop even once--> 

           <li> 
            <img src="{{cloudinaryUrl image width='300' height='300'}}" > 
            <p>{{title}}</p> 
           </li> 

      {{/each}} 

     </ul> 
    </div> 
    <!-- the code below works correctly --> 
    <div class="events row"> 

     {{# each data.events.results}} 
      <div class="col-md-4 col-lg-4"> 
       <h3><a href="{{eventUrl slug}}">{{{title}}}</a></h3> 
       <p class=" text-muted">{{{categoryList categories prefix="Posted in "}}} 
        {{#if author.name.first}}by {{author.name.first}}{{/if}} 
       </p> 
       {{#if image}}<img src="{{{cloudinaryUrl image height=160 crop='fit' }}}" class="img center-block">{{/if}} 
       <p>{{{content.brief}}}</p> 
       {{#if content.extended}}<p class="read-more"><a href="{{eventUrl slug}}">Read more...</a></p>{{/if}} 
      </div> 
     {{/each}} 
    </div> 
</div> 

Я очень надеюсь, что мой вопрос ясен и кто-то может помочь мне

ответ

0

код в ваш маршрут устанавливает locals.data.events поэтому вы можете использовать его от рулей. Однако вы не устанавливаете locals.slider, поэтому цикл {{#each slider}} не выполняется.

В вашем пути, вы должны сделать что-то вроде

keystone.list('Slider').model.find().exec(function (err, results) { 
    locals.sliders = restuls; 
    next(err); 
} 

который заполняет locals.slider так что вы можете сделать {{#each slider}} в шаблоне HBS. Остальная часть вашего кода должна работать нормально.

(Отказ от ответственности, я на самом деле не проверял это, но он должен работать. Если нет, то попытаться выяснить, что случилось. Есть много примеров такого кода в keystone demo project)

+0

Благодарим Вас за Намек. Я забыл загрузить их. Это не сработало с вашим кодом, но это был view.query ('ползунки', keystone.list ('Slider'). Model.find(). Sort ('sortOrder')); в index.js (routes/views/index.js) –

+0

А, я думаю, что мой, возможно, не сработал, если вы просто вставили его ближе к концу вашего бита 'view.on', так как вы вызываете' next() ' после заполнения ваших событий. Если вы положили if перед 'next (err);' в своей функции 'q.exec', это должно сработать. Думаю, пока это работает, на самом деле это не имеет значения. –