2012-05-07 16 views
16

मैं backbone.js के साथ एक एकल पृष्ठ एप्लिकेशन बना रहा हूं और शीर्षक को बदलने के लिए सबसे अच्छा तरीका जानना चाहता हूं। मैं दृश्य में 'शीर्षक' विकल्प रखने के बारे में सोच रहा था और राउटर (किसी भी तरह) दस्तावेज़.title सेट करने के बारे में सोच रहा था। क्या किसी ने कुछ भी इसी तरह लागू किया है? धन्यवादबैकबोन और दस्तावेज़.title

+1

आपको 'View.title' क्यों चाहिए? .. मुझे लगता है कि दृश्य' पेज.title' से संबंधित नहीं होना चाहिए, मुझे लगता है कि 'राउटर' को बिना 'document.title' को ओवरराइट करना चाहिए अपने आवेदन के किसी भी अन्य घटक परेशान करें। – fguillen

+0

इस समय मेरे पास यह तरीका है, राउटर में दोहराव कोड से बचना चाहता था। मैं राउटर में एक फ़ंक्शन को बाध्य करने के बारे में सोच रहा हूं जो एक दृश्य का शीर्षक प्राप्त करता है और इसे प्रत्येक रूट – Xerri

उत्तर

33

बैकबोन.जेएस की घटना प्रकृति का उपयोग क्यों न करें।

सबसे पहले मुझे नहीं लगता कि यह दस्तावेज़ शीर्षक को अद्यतन करने के लिए राउटर तक है। विशेष रूप से यदि आप बड़े क्लाइंट-साइड अनुप्रयोगों के साथ काम कर रहे हैं तो आप इसे सरल रखना चाहते हैं और सुनिश्चित करें कि आपके आवेदन के प्रत्येक भाग में एक विशिष्ट कार्य पूरा हो।

राउटर मार्गों का प्रतिनिधित्व करने के लिए राउटर है, और कुछ भी नहीं।

जो मैं इसके बजाय सुझाव दूंगा (इस पर निर्भर करता है कि आप अपना आवेदन कैसे प्रारंभ करते हैं) एक एप्लिकेशन-स्तरीय ईवेंट एग्रीगेटर बनाने के लिए।

var app = new Application(); 
app.eventAggregator = _.extend({}, Backbone.Events); 

और इस तरह के रूप में अपने अनुप्रयोग के लिए एक घटना बाँध:

app.eventAggregator.on('domchange:title', this.onDomChangeTitle, this); 

जहां अपने आवेदन में बजाय करने के लिए रूटर करने के लिए इसे छोड़ने के लिए होने के

onDomChangeTitle: function (title) 
{ 
    $(document).attr('title', title); 
} 

और अब निर्माण, हमेशा शीर्षक को पकड़ें और सुनिश्चित करें कि प्रत्येक दृश्य में getTitle विधि है, आप कर सकते हैं - अपने दृश्य के अंदर और इसलिए, कोई भी दृश्य - जब आप दृश्य प्रस्तुत या प्रारंभ करते हैं तो निम्न ईवेंट को ट्रिगर करें:

app.eventAggregator.trigger('domchange:title', this.title); 

यह मेरी राय में क्लीनर और दुबला कोड बनाता है, लेकिन फिर, यह सिर्फ एक राय है।

+1

के साथ लाइन दोहराए बिना दस्तावेज़.title के रूप में सेट करता है। यह एक दिलचस्प समाधान भी है। मैं कल्पना की थी (उन्हें बनाया गया) जहां दृश्य "सक्रिय" है, प्रारंभ या पुन: प्रस्तुत नहीं किया गया है (शायद उदाहरण के लिए यह अभी छिपा हुआ है)। इसलिए, मुझे ट्रिगर करने के लिए "सक्रिय" फ़ंक्शन/ईवेंट जोड़ना होगा। इसके अलावा, रचना के कारण, मुझे यकीन नहीं था कि क्या एक दृश्य को पता होना चाहिए कि यह बड़ी तस्वीर में कैसे फिट बैठता है (शायद इसे अभी शीर्षक परिवर्तन को ट्रिगर करने की अनुमति नहीं दी जानी चाहिए)। फिर भी, मुझे पैटर्न पसंद है। – WiredPrairie

+2

ने इसका पुनरीक्षण किया और आवेदन के लिए एक वैश्विक चर लागू किया। इसमें मैं एक ईवेंट एग्रीगेटर स्टोर करता हूं। एक घटना दृश्य द्वारा ट्रिगर की जाएगी और एग्रीगेटर दस्तावेज़ शीर्षक बदल देगा। एक साइड नोट के रूप में राउटर पर किसी भी रूट परिवर्तन को सुनने के लिए एक कार्यक्रम बनाया जा सकता है। यह शायद document.title परिवर्तन को ट्रिगर कर सकता है। http://stackoverflow.com/a/9521144 – Xerri

2

मैं सुझाव देता हूं कि कोड को अपने राउटर कॉलबैक में रखें। यह कोड की एक और पंक्ति होगी, लेकिन वर्तमान दृश्य के ज्ञान के बिना, राउटर/ऐप नहीं जान पाएगा कि किस दृश्य में सही शीर्षक है। (व्यवहार को ओवरराइड करने के लिए वास्तव में कोई अच्छी जगह नहीं है और बैकबोन.जेएस में कुछ अंतर्निहित कार्यों को प्रतिस्थापित किए बिना दस्तावेज़ शीर्षक प्रदान करें)। अपने रूटर कॉलबैक में

var PeopleView = Backbone.View.extend({ 
    title: 'People are People', 
    // 
    //or 
    // 
    getTitle: function() { 
     return "Something Dynamic"; 
    } 
}); 

और फिर:

तुम बहुत बस अपने दृश्य के लिए कुछ जोड़ सकते हैं

var v = new PeopleView(); 
$(document).attr('title', v.getTitle()); 

एक अन्य विकल्प अभी है दृश्य में सेट करना होगा कब बनाया जाता है या जब एक विशेष विधि कहा जाता है। लेकिन, मैं पहले विकल्प का उपयोग करता हूं।

27

आप शुद्ध जावास्क्रिप्ट का उपयोग कर दस्तावेज़ के शीर्षक को बदलने के लिए jQuery का उपयोग क्यों कर रहे हैं? तेज़, आसान, क्लीनर ...

document.title = 'new title'; 
+16

... क्या आप गंभीर हैं? चलो, यह सबसे बेवकूफ चीज है जिसे मैंने कभी सुना है। jQuery शुद्ध जेएस पर बना है और, वास्तव में, jQuery शुद्ध जेएस के साथ चीजों को बनाने के लिए एक ढांचा है। तो, शुद्ध जेएस का उपयोग कर समस्या क्या है ??? – miduga

+0

यह सब सही है (निश्चित रूप से jquery शुद्ध जेएस का उपयोग करके बनाया गया है!), लेकिन मैंने जो कहा वह नहीं, यह हमेशा क्लीनर दिखाई देगा यदि आप एक या दूसरे से चिपके रहते हैं। –

+9

लोग jQuery पर बहुत अधिक दुबला हैं। अब बिंदु पर जहां लोग खुद को 'जेएस डेवलपर्स' कहते हैं, वे याद नहीं कर सकते हैं कि मूल जावास्क्रिप्ट –

1

यह मैं इस अपने प्रोजेक्ट क्या करना है:

var App = {}; 

App.HomeView = Backbone.View.extend({ 
    documentTitle: 'my site title' 
}) 
var Router = Backbone.Router.extend({ 
    routes: { 
     '': 'home' 
    , 'home': 'home' 

, baseTitle: ' - my site' 

, home: function(actions) { 
    var obj = this; 
    obj._changePage('HomeView'); 
    } 

, changeTitle: function(title, withoutBaseTitle) { 
    var obj = this; 

    if(withoutBaseTitle !== true) 
     title += obj.baseTitle; 

    document.title = title; 
    return obj; 
    } 

, _changePage: function(viewName, viewOptions) { 
    var obj = this; 
    var page = App[viewName](); 

    if(typeof page.documentTitle !== 'undefined') { 
     obj.changeTitle(page.documentTitle); 
    } 
    } 

}) 
1

किंडा बहुत पुरानी पोस्ट, लेकिन मैं इसे एक और पुनर्जन्म दे देंगे।


वर्तमान Marionette v3.2.0 साथ

आप निम्न कर सकते हैं:

// Get title from view where we manage our layout/views 
var viewTitle = view.triggerMethod('page:title'); 

आपके विचार में आप बनाने इस तरह जादू विधि:

Mn.View.extend({ 
    onPageTitle() { 
     return ['User', this.model.get('id')].join(' | '); 
    } 
}); 

और एक शीर्षक संकल्प ही निम्न हो सकता है :

document.title = !!viewTitle 
     ? (
      _.isArray(viewTitle) 
       ? [baseTitle].concat(viewTitle) 
       : [baseTitle, viewTitle] 
     ).join('/') 
     : baseTitle ; 

खिताब के संकल्प एक भी विभाजक

  • यह आसानी से आवेदन कार्यप्रवाह में एकीकृत किया जा सकता जगह में जहां आप अपनी सामग्री से पता चलता है प्रबंधन द्वारा सरणियों और implodes के रूप में वापस देता है।
  • onPageTitle दृश्य के संदर्भ में कहा जाएगा (this फ़ंक्शन फ़ंक्शन के अंदर दृश्य उदाहरण होगा), मॉडल डेटा और किसी भी दृश्य से संबंधित सामग्री का आह्वान करने की संभावना क्या होती है।
  • जांच विधि उपलब्धता के साथ परेशान करने की कोई आवश्यकता नहीं है, बस कॉल-एंड-गो।
  • इसके अलावा, यदि आप triggerMethod के रूप में परिभाषित नहीं हैं तो आप हमेशा डिफ़ॉल्ट शीर्षक पर फ़ॉलबैक कर सकते हैं यदि ऐसे मामलों पर undefined वापस आ जाएगा।
  • लाभ!
+0

आपके इनपुट के लिए धन्यवाद लेकिन इस पोस्ट के बाद से कोणीय में स्विच किया गया। – Xerri

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