2017-02-22 5 views
0

私はプロジェクト上でkeystone.jsを使っています。そして、私はハンドルバー(hbs)を使ってテンプレートを作成しています 私がしたいこと:私のインデックスページでは、スライダを表示したいです(これをunslider.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> 

は、私は本当に私の質問が明確であり、誰かがあなたのルート内のコードは、あなたがハンドルからそれを使用することができる理由であるlocals.data.eventsを設定してくれ

答えて

0

を助けることができることを願っています。ただし、locals.sliderを設定していないため、{{#each slider}}ループが実行されません。あなたのルートで

、あなたもあなたの中にあなたのHBSテンプレートで{{#each slider}}を行うことができるようにlocals.sliderを移入

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

ような何かをする必要があります。残りのコードは正常に動作するはずです。

(免責事項が、私は実際にこれをテストしていませんでしたが、それは動作するはずです。そうでない場合は、何が起こったのかを試してみて、うまく。この種のコードの例の多くはkeystone demo projectにあります)

+0

をいただき、ありがとうございますヒント。私はそれらを読み込むことを忘れた。あなたのコードではうまくいきませんでしたが、view.query( 'sliders'、keystone.list( 'Slider'))。model.find()。sort( 'sortOrder')); index.js(routes/views/index.js) –

+0

ああ、私があなたの 'view.on'ビットの最後に貼り付けただけではうまくいかないかもしれないと思います。イベントを入力した後 'q.exec'関数の中で' next(err);の前に置くと、それはうまくいきました。それが働いている限り、それは本当に問題ではない、と思う。 –

関連する問題