كيف يمكنني نقل المحتوى من قالب إلى تخطيط في Express؟

StackOverflow https://stackoverflow.com/questions/3601080

  •  25-09-2019
  •  | 
  •  

سؤال

لدي خادم صريح أساسي:

// server.js:
var Express = require('express');
app = Express.createServer();
app.configure(function(){
  app.set('views', Path.join(__dirname, 'views'));
  app.set('view engine', 'jade');
  app.set('view options');
});
app.get('/', function (request, response) {
  response.render('welcome', {
    locals: {some: 'Locals'}
  });
});

مع تخطيط اليشم الأساسي:

// views/layout.jade:
!!! 5
html(lang='en')
  head
    title= pageTitle
  body
    h1= pageTitle
    aside(id="sidebar")= sidebarContent
    #content
      #{body}

وصفحة بسيطة:

# views/welcome.jade:
// How do I pass pageTitle and sidebarContent out to the layout from here?
p
  Welcome to my fine site!

(في القضبان ، قد يكون هذا شيء مثل content_for أو متغير مثيل بسيط.)

هل كانت مفيدة؟

المحلول

باستخدام النصيحة أعلاه حول Dynamichelpers ، وسحر الإغلاق ، وجدت حلًا أنيقًا إلى حد ما يعمل دون إشراك كائن الطلب. تتمثل الحيلة في لف متغير عنوان الصفحة في إغلاق يوفر وظيفة GET () و SET () حوله ، وجعل هذا الكائن Wrapper نتيجة المساعد الديناميكي Page_Title.

إنشاء property.js:

exports.create = function () {
    var value = null;
    return {
        get: function () {
           return value;
        },
        set: function (new_value) {
           value = new_value;
        }
    };
}

لذا فإن الاتصال Create () بإرجاع كائن باستخدام طريقة GET () و SET () ، والتي تحصل على متغير الإغلاق وتعيينه.

ثم ، في رمز إعداد التطبيق الخاص بك:

    var property = require("./property.js");
    app.dynamicHelpers ({
        page_title: function () {
         return property.create ();
        }
    });

نظرًا لأن قيمة المساعد الديناميكي هي نتيجة لاستدعاء وظيفته ، في عرضك وقالبك ، سيكون متغير page_title هو كائن التفاف مع وظائف GET () و set ().

في رأيك ، يمكنك أن تقول:

- page_title.set ("my specific page title");

وفي تخطيطك:

title= page_title.get()

لتبسيط هذا أبعد قليلاً ، إضافة هذا إلى property.js:

exports.creator = function () {
    return function () {
        return exports.create();
    };
}

يتيح لك تبسيط كتلة إعلان المساعدين الديناميكيين إلى هذا:

        var property = require("./property.js");
        app.dynamicHelpers ({
            page_title: property.creator()
        });

نصائح أخرى

لا يحتوي Express على فكرة مسبقة عن "الكتل" أو أي شيء يسمونه في القضبان ، ولكن يمكنك استخدام مجموعة من المساعدين () و Dynamichelpers () لتحقيق شيء مشابه http://expressjs.com/guide.html#app-helpers-obj-

يتوفر السكان المحليون لكل من التصميم وعرض الصفحة رغم ذلك

تخطيط

# the following function is a safe getter/setter for locals
- function pagevar(key, value) { var undef; return (value===undef) ? locals[key] || null : locals[key] = value; }
block config
  #intended as a non-rendered block so that locals can be overridden.
  # put your defaults here... - use append in the child view
!!!
html
  head
    title=pagevar('title')
    meta(name='description',content=pagevar('description'))
...

page.jade

append config
  - locals.title = 'override';
  - locals.description = 'override 2';
  - pagevars('somekey', 'some value');
...

سهلة بيزي.

يمكنك القيام بذلك باستخدام هذا المقتطف الصغير.

Prop.JS:

var hash = {};
module.exports = function() {
    return {
        set: function(key, val) { hash[key] = val },
        get: function(key) { return hash[key] }
    };
};

server.js:

app.dynamicHelpers({ prop: require(__dirname + '/views/helpers/prop') });

رأي:

<% prop.set('foo', 'bar') %>

تَخطِيط:

<%= prop.get('foo') %>

مررها في السكان المحليين: {some: 'Locals', pageTitle: 'Welcome!'}

لـ Express 3 Template Agnostic ، يعمل بشكل جيد مع express-partials

app.use (req, res, next)->
  req.locals = {} unless req.locals

  res.locals.content_for = (k, v = null)->
    if !v
      req.locals[k]
    else
      req.locals[k] = v

  next()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top