2016-06-26 3 views
0

Ich habe ein neues Objekt namens Project erstellt, das eine Galerie und einige andere Felder enthält. In der Ansicht zeige ich einige Daten davon und ich möchte einen Link zum vorherigen und nächsten Projekt hinzufügen. Ich habe es bereits geschafft, das vorherige Projekt zu bekommen, aber wenn ich versuche, den Slug daraus zu bekommen, funktioniert es irgendwie nicht. Get Slug von Objekt in Sicht wird nicht funktionieren

Dies ist das Projektmodell:

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

/** 
* Project Model 
* ========== 
*/ 

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

Project.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' } }, 
    category: { type: String, required: false }, 
    description: { type: Types.Html, wysiwyg: true, height: 150 }, 
    shortDescription: { type: Types.Html, wysiwyg: true, height: 100 }, 
    credits: { type: Types.Html, wysiwyg: true, height: 100 }, 
    galleries: { type: Types.Relationship, ref: 'Gallery', many: false }, 
    color: { type: String, required: false } 
}); 

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

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

Dies ist der Controller:

var keystone = require('keystone'); 

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

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

    // Set locals 
    locals.section = 'projects'; 
    locals.filters = { 
     project: req.params.project 
    }; 
    locals.data = { 
     projects: [], 
     previousProject: [] 
    }; 

    // Load the current project 
    view.on('init', function(next) { 

     var q = keystone.list('Project').model.findOne({ 
      state: 'published', 
      slug: locals.filters.project 
     }).populate('galleries'); 

     q.exec(function(err, result) { 
      locals.data.project = result; 
      next(err); 
     }); 

    }); 

    //Load other projects 
    view.on('init', function(next) { 

     var q = keystone.list('Project').model.find({state: "published", publishedDate: {$lt: locals.data.project.publishedDate}}).sort('-publishedDate').limit(1); 
     q.exec(function(err, results) { 
      locals.data.previousProject = results; 
      next(err); 
     }); 

    }); 

    // Render the view 
    view.render('project'); 

}; 

Und dies ist die Ansicht:

<div class="container"> 
    <p>{{{data.project.title}}}</p> 
    <p>—</p> 
    <p>{{{data.project.category}}}</p> 

    {{#if data.project.galleries}} 
     {{#each data.project.galleries.images}} 
      <img src="{{url}}" /> 
     {{/each}} 
    {{/if}} 
    <p>full project: {{data.previousProject}}</p> 
    <p>slug: {{data.previousProject.slug}}</p> 
    {{#if data.previousProject}} 
     <a href="/projects/{{data.previousProject.slug}}" >Previous project</a> 
    {{/if}} 
</div> 

Irgendwie zeigt {{data.previousProject}} der richtige Infosatz aber wenn ich {{data.previousProject.slug}} mache, gibt es überhaupt nichts zurück. Ich kratze mich stundenlang dagegen, aber ich kann nicht herausfinden, wo das Problem liegt. Danke im Voraus!!

Antwort

0

fand ich endlich, was das Problem war: in der Steuerung I model.find bin mit, während ich model.findOne verwenden sollte, wenn ich weiß, dass ich einen Datensatz nur brauchen, und ich möchte direkt auf die Werte aus es mit .slug zu bekommen. Die Verwendung von limit(1) war nicht genug.