Handlebars.js: خطأ: كائن قالب غير معروف: سلسلة عند استخدام قالب مترجم مسبقًا مع .template ()

تم إنشاؤها على ١٢ ديسمبر ٢٠١٤  ·  4تعليقات  ·  مصدر: handlebars-lang/handlebars.js

أحاول تسجيل جزء ، والذي وفقًا للمستندات يجب أن يتم على النحو التالي:

var partialString = fs.readFileSync(filename), {encoding: 'utf8'})
var compiledPartial = handlebars.precompile(partialString)
var template = handlebars.template(compiledPartial)

handlebars.registerPartial('stuff', template)

ومع ذلك ، ينتج عن طريقة .template() هذا الخطأ:

Error: Unknown template object: string

أستطيع أن أرى أن compiledPartial أعلاه هو بالفعل سلسلة تشبه الكائن:

{"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) {
return "<div>Stuff</div>\n";
},"useData":true}

ماهذا الهراء؟

العقدة 0.10.25 ، المقاود 2.0.0

التعليق الأكثر فائدة

أنا أكتب تطبيقًا من جانب الخادم يحتاج إلى أن يكون قادرًا على كلٍّ من قوالب التجميع المسبق (ثم تسليمها إلى العميل في حالة الحاجة إلى إعادة تقديمها مع سياق جديد) وكذلك عرضها على HTML (لميض / وميض أقل وضوحًا / تأخير على العميل + تحسين محركات البحث). يبدو أنني بحاجة إلى استدعاء كل من precompile و compile بشكل منفصل أو أحتاج إلى eval الناتج المتسلسل قبل المترجم. لا يشعر أي من هذين الأسلوبين بالأناقة ، فهل فاتني شيء أم أن تطبيقي غير عادي؟ (راجع للشغل ، هذا التطبيق مكتوب بلغة Java ولكن باستخدام محرك JavaScript مدمج [Rhino / Nashorn] لجزء القوالب ؛ آمل أن هذا لا يهم.)

في حالة ارتباك أي شخص آخر من التوثيق الخاص بالتجميع المسبق وانتهى به الأمر هنا ، فقد قمت بكتابة مثال لتوضيح ما يجري. (في الواقع ، لقد كتبته لأنني كنت أحاول معرفة الخطأ الذي أفعله.)

var templateSources = {
    hi: "Hi, {{name}}.",
    bye: "Goodbye, {{name}}."
};
var compiledTemplates = {};
var serializedTemplates = {};
var deserializedTemplates = {};

Object.keys(templateSources).forEach(function(name) {
    // Use compile method to generate actual executable template (function)
    compiledTemplates[name] = Handlebars.compile(templateSources[name]);
    // Use precompile method to generate serialized JS (string)
    serializedTemplates[name] = Handlebars.precompile(templateSources[name]);
    // If we really want, we can deserialize these 
    deserializedTemplates[name] = Handlebars.template(evalPrecompiledTemplate(serializedTemplates[name]));
});

// (Yes, I know eval is dangerous)
function evalPrecompiledTemplate(s) {
    return eval("(function(){return " + s + "}());");
}

// Quick demonstration that these template functions work the same
var context = {
    name: "John Smith"
};

// Output: 
// Rendering template named hi with context: Object {name: "John Smith"}
// Hi, John Smith.(compiled)
// Hi, John Smith.(precompiled/deserialized)
// Rendering template named bye with context: Object {name: "John Smith"}
// Goodbye, John Smith.(compiled)
// Goodbye, John Smith.(precompiled/deserialized)
Object.keys(templateSources).forEach(function(name) {
  console.log("Rendering template named " + name + " with context:", context);
  console.log(compiledTemplates[name](context) + "(compiled)");
  console.log(deserializedTemplates[name](context) + "(precompiled/deserialized)");
});

ال 4 كومينتر

الغرض من الطريقة precompiler هو إجراء تسلسل للقالب ثم يتم استخدام طريقة template لاستعادته على العميل. إذا كنت تحاول تقييم القالب في نفس العملية ، فعليك استخدام Handlebars.compile مباشرة.

شكرا على الاجابة. يبدو أن المستندات موجهة بشكل أكبر نحو استخدام المقاود في جانب العميل ، نظرًا لأنه من الممكن تمرير السلسلة الجزئية غير المجمعة فقط إلى طريقة registerPartial() ، إذا كنت تستخدم فقط المقاود على جانب الخادم.

أنا أكتب تطبيقًا من جانب الخادم يحتاج إلى أن يكون قادرًا على كلٍّ من قوالب التجميع المسبق (ثم تسليمها إلى العميل في حالة الحاجة إلى إعادة تقديمها مع سياق جديد) وكذلك عرضها على HTML (لميض / وميض أقل وضوحًا / تأخير على العميل + تحسين محركات البحث). يبدو أنني بحاجة إلى استدعاء كل من precompile و compile بشكل منفصل أو أحتاج إلى eval الناتج المتسلسل قبل المترجم. لا يشعر أي من هذين الأسلوبين بالأناقة ، فهل فاتني شيء أم أن تطبيقي غير عادي؟ (راجع للشغل ، هذا التطبيق مكتوب بلغة Java ولكن باستخدام محرك JavaScript مدمج [Rhino / Nashorn] لجزء القوالب ؛ آمل أن هذا لا يهم.)

في حالة ارتباك أي شخص آخر من التوثيق الخاص بالتجميع المسبق وانتهى به الأمر هنا ، فقد قمت بكتابة مثال لتوضيح ما يجري. (في الواقع ، لقد كتبته لأنني كنت أحاول معرفة الخطأ الذي أفعله.)

var templateSources = {
    hi: "Hi, {{name}}.",
    bye: "Goodbye, {{name}}."
};
var compiledTemplates = {};
var serializedTemplates = {};
var deserializedTemplates = {};

Object.keys(templateSources).forEach(function(name) {
    // Use compile method to generate actual executable template (function)
    compiledTemplates[name] = Handlebars.compile(templateSources[name]);
    // Use precompile method to generate serialized JS (string)
    serializedTemplates[name] = Handlebars.precompile(templateSources[name]);
    // If we really want, we can deserialize these 
    deserializedTemplates[name] = Handlebars.template(evalPrecompiledTemplate(serializedTemplates[name]));
});

// (Yes, I know eval is dangerous)
function evalPrecompiledTemplate(s) {
    return eval("(function(){return " + s + "}());");
}

// Quick demonstration that these template functions work the same
var context = {
    name: "John Smith"
};

// Output: 
// Rendering template named hi with context: Object {name: "John Smith"}
// Hi, John Smith.(compiled)
// Hi, John Smith.(precompiled/deserialized)
// Rendering template named bye with context: Object {name: "John Smith"}
// Goodbye, John Smith.(compiled)
// Goodbye, John Smith.(precompiled/deserialized)
Object.keys(templateSources).forEach(function(name) {
  console.log("Rendering template named " + name + " with context:", context);
  console.log(compiledTemplates[name](context) + "(compiled)");
  console.log(deserializedTemplates[name](context) + "(precompiled/deserialized)");
});

jacobq سترغب في استدعاء compile و preompile. الكود الذي تم إنشاؤه للاثنين مختلف تمامًا ولن أفترض أن محاولة toString أو ما شابه ذلك سيعمل مع إخراج الترجمة ، إلخ.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات