2012-06-18 11 views
8

के साथ Backbone.Marionette.ItemView का उपयोग कैसे करें निम्न कोड Backbone.Marionette.ItemView का उपयोग करके ठीक काम करता है लेकिन Mustache नहीं।मूंछ

Backbone.Marionette.ItemView - no Mustache

मैं एक ही कोड लेकिन टेम्पलेट varaible Mustache का उपयोग कर लोड हो रहा है का उपयोग करना चाहते हैं।

Backbone.Marionette.ItemView - with Mustache

किसी भी विचार क्यों my code काम नहीं करता है और यही कारण है:

यहाँ मेरी कोड है?

धन्यवाद

उत्तर

8

कठपुतली डिफ़ॉल्ट रूप से UnderscoreJS टेम्पलेट्स के उपयोग मान लिया गया है। दृश्य के लिए बस template कॉन्फ़िगरेशन को प्रतिस्थापित करना पर्याप्त नहीं है। प्रतिपादन प्रक्रिया कैसे काम करती है इसे बदलने की भी आपको आवश्यकता है।


Backbone.Marionette.Renderer.render = function(template, data){ 
    return Mustache.to_html(template, data); 
} 

var rowTemplate = '{{ username }}{{ fullname }}'; 

// A Grid Row 
var GridRow = Backbone.Marionette.ItemView.extend({ 
    template: rowTemplate, 
    tagName: "tr" 
}); 

ध्यान रखें कि आपके JSFiddle अभी भी जीता:

अपने सरल उदाहरण में, आप केवल मूंछें कॉल करने के लिए Marionette.Renderer.render समारोह ओवरराइड करने के लिए, और फिर स्ट्रिंग टेम्पलेट के लिए अपने विचार है कि आप चाहते हैं की template सेट की जरूरत है जब आप इस कोड को जगह में डालते हैं तब भी काम नहीं करते हैं, क्योंकि GridView अभी भी एक jQuery चयनकर्ता/स्ट्रिंग का उपयोग template विशेषता के रूप में कर रहा है। मूंछ वापस करने के लिए आपको इसे उसी प्रकार के template फ़ंक्शन के साथ प्रतिस्थापित करने की आवश्यकता होगी।

http://jsfiddle.net/derickbailey/d7qDz/

+1

स्रोत को देखकर (http://derickbailey.github.com/backbone.marionette/docs/backbone.marionette.html#section-115) ऐसा लगता है कि यह 'Backbone.Marionette को ओवरराइड करने के लिए पर्याप्त होना चाहिए। TemplateCache.prototype.compileTemplate': http://jsfiddle.net/me4NK/78/ अधिक उचित तरीका क्या है? – theotheo

+2

यह इस बात पर निर्भर करता है कि आप डीओएम से टेम्पलेट का चयन करने या कच्चे स्ट्रिंग के रूप में टेम्पलेट प्रदान करने के डिफ़ॉल्ट व्यवहार का उपयोग कर रहे हैं या नहीं। इस प्रश्न के मामले में, टेम्पलेट एक कच्ची स्ट्रिंग है, इसलिए ओवरराइडिंग 'Renderer.render' अधिक उपयुक्त है। यदि टेम्पलेट एक DOM '

14

मैं इस सवाल का जवाब यहाँ एक सा के रूप में मैं सिर्फ इस के साथ संघर्ष कर रहा था अपडेट करना चाहते हैं; और मैं इस जवाब का संदर्भ के रूप में उपयोग कर रहा था।

जवाब यहाँ मूंछें वर्तमान के संस्करण (जो समझा जा सकता है के रूप में यह बहुत पुरानी है)

  • Mustache.to_html साथ पुराने हो चुके एक सा है:

    यहाँ मेरी निष्कर्ष है अब बहिष्कृत, लेकिन अभी भी मूशा के साथ एक साधारण रैपर के रूप में मौजूद है। पीछे की ओर compat के लिए। Check out this link

साथ ही, मैं अधिभावी Marionette.Renderer.render, स्वीकार किए जाते हैं जवाब से ऊपर के रूप में मिल गया है, पूरी तरह से Marionette.TemplateCache परत जो वांछित व्यवहार नहीं किया जा सकता नजरअंदाज।

// Source: http://bit.ly/1f7CBRy 

render: function(template, data){ 

    if (!template) { 
    var error = new Error("Cannot render the template since it's false, null or undefined."); 
    error.name = "TemplateNotFoundError"; 
    throw error; 
    } 

    var templateFunc; 
    if (typeof template === "function"){ 
    templateFunc = template; 
    } else { 
    templateFunc = Marionette.TemplateCache.get(template); 
    } 

    return templateFunc(data); 
} 

आप देख सकते हैं यह Marionette.TemplateCache.get विधि एक्सेस करता है और इसके बाद के संस्करण जवाब कुछ भी नहीं है कि कार्यक्षमता बनाए रखने के लिए करता है:

यहाँ Marionette.Renderer.render विधि के लिए स्रोत है ।

अब मेरी हल करने के लिए प्राप्त करने के लिए (ध्यान दें: ऊपर जवाब जरूरी गलत नहीं है, इस Marionette.TemplateCache परत बनाए रखने के लिए बस अपना दृष्टिकोण है):

के रूप में टिप्पणी के ऊपर का सुझाव, compileTemplate ओवरराइड बजाय:

Marionette.TemplateCache.prototype.compileTemplate = function(rawTemplate) { 

    // Mustache.parse will not return anything useful (returns an array) 
    // The render function from Marionette.Renderer.render expects a function 
    // so instead pass a partial of Mustache.render 
    // with rawTemplate as the initial parameter. 

    // Additionally Mustache.compile no longer exists so we must use parse. 
    Mustache.parse(rawTemplate); 
    return _.partial(Mustache.render, rawTemplate); 
}; 

Here's a working JSFiddle as proof

पहेली में मैंने Marionette.TemplateCache.loadTemplate को यह भी प्रदर्शित करने के लिए ओवरराइड किया है कि यह केवल एक बार कहा जाता है। फ़ंक्शन का बॉडी केवल कुछ डीबग आउटपुट जोड़ता है और उसके बाद अधिकांश मूल कार्यक्षमता (शून्य त्रुटि प्रबंधन) को फिर से लागू करता है।

+0

इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। –

संबंधित मुद्दे