2011-11-17 57 views
1

我一直在使用flash messages來完成Alex Young的教程。根據本教程,可以使用dynamicHelpers覆蓋默認的Flash消息格式。不幸的是,沒有提供關於正在發生的事情的細節,並且不可能在教程頁面上發佈任何評論以詢問相關問題。如何使用動態助手重寫express.js中的flash消息?

我沒有看到的是調用文件'app.js'中的req.flash()和文件'helpers.js'中導出的FlashMessage對象之間的關係。爲什麼在express.js中定期調用req.flash()(這是一個標準函數),首先鏈接到此FlashMessage原型?當我查看代碼時,我看不到這是如何發生的。

起初我以爲FlashMessage對象可能已經通過express.js提供給req.flash(),在這種情況下,我們只是在我們的幫助文件中擴展或覆蓋它。這個問題是,我無法在express.js的源代碼中找到任何對FlashMessage的引用。

如果有人能解釋給我,我會很感激。

閃光燈消息在文件 'apps.js' 通過調用設置:

req.flash('info', 'Document created.'); 

的FlashMessage obect導出 'helpers.js':

FlashMessage.prototype = { 
    // Get css definition string for icon. 
    get icon() { 
    switch (this.type) { 
     case 'info': 
     return 'ui-icon-info'; 
     case 'error': 
     return 'ui-icon-alert'; 
    } 
    }, 

    // Get css class for message container. 
    get stateClass() { 
    switch (this.type) { 
     case 'info': 
     return 'ui-state-highlight'; 
     case 'error': 
     return 'ui-state-error'; 
    } 
    }, 

    // Returns HTML formatted message. 
    toHTML: function() { 
    return '<div class="ui-widget flash">' + 
      '<div class="' + this.stateClass + ' ui-corner-all">' + 
      '<p><span class="ui-icon ' + this.icon + '"></span>' + this.messages.join(', ') + '</p>' + 
      '</div>' + 
      '</div>'; 
    } 
}; 

exports.dynamicHelpers = { 
    flashMessages: function(req, res) { 
    var html = ''; 
    ['error', 'info'].forEach(function(type) { 
     var messages = req.flash(type); 
     if (messages.length > 0) { 
     html += new FlashMessage(type, messages).toHTML(); 
     } 
    }); 
    return html; 
    } 
}; 

在app.js文件中調用req.flash的完整路由功能如下:

// Attach dynamicHelpers to app. 
app.dynamicHelpers(require('./helpers.js').dynamicHelpers); 

// Routing function which calls req.flash. 
app.post('/documents', loadUser, function(req, res) { 
    // Create Document object and assign value. 
    console.log('Document content: %s', req.body['document']); 
    var document = new Document(req.body['document']); 
    document.save(function() { 
     // Redirect to another page. 
     req.flash('info', 'Document created.'); 
     res.redirect('/documents'); 
    } 
    }); 
}); 

回答

2

這裏有兩個不同的東西:

一)req.flash(),它是通過快速自身來實現 - 不是你,你只是使用功能
B)動態幫手:

從快速指南:

動態視圖助手只是接受req,res的函數,並且在渲染視圖之前針對服務器實例對 進行評估。 該函數的返回值成爲與之相關的局部變量 。

app.dynamicHelpers({ 
    session: function(req, res){ 
    return req.session; 
    } 
}); 

讓我們的「翻譯」那到你的代碼:

// Attach dynamicHelpers to app. 
app.dynamicHelpers(require('./helpers.js').dynamicHelpers); 

這意味着,當你調用變量flashMessages在您的視圖代碼,你會得到那些閃光變量的HTML表示定義。

所以這裏最重要的是考慮你只使用req.flash(),而不是實現它。您正在實施使用該功能的助手。

+0

因此,簡單地說,我們使用req.flash將消息字符串附加到請求中,然後通過req.flash將它們提供給dynamicHelpers。當頁面呈現時,flashMessages作爲局部變量傳遞給jade模板。現在做出總體感覺。非常感謝。 – Benjen

+0

沒問題,總是樂於幫忙! – alessioalex