2014-01-18 61 views
1

序言: 我不確定這是不是問這個問題的最好方法,因爲我相信它比我做得更一般,可能有一個全球模式,解決我的關切。locomotivejs和mongoose:將承諾變量傳遞給控制器​​

目前這裏是我正在使用的原始代碼的上下文中的問題。

給定一個locomotivejs控制器,讓我們稱之爲Contact_Controller,與一般的結構是這樣的:

'\controllers\contact_controller.js 
var locomotive = require('locomotive') 
    , Controller = locomotive.Controller 
    , Contact = require('../models/contact') 
    , sender = require('../helpers/sender') 
    ; 


var Contact_Controller = new Controller(); 

然後:

Contact_Controller.list = function() { 
//Provides a list of all current (successful) contact attempts 


var controller = this; 

Contact.find({status: 1}, function(err, results) { 
    if(err) { 
     controller.redirect(controller.urlFor({controller: "dashboard", action: "error"})); 
    } 
    controller.contacts = results; 
    controller.render(); 
}); 
}; 

和模型:

'/models/contact.js 
var mongoose = require('mongoose') 
, mongooseTypes = require('mongoose-types') 
, pass = require('pwd') 
, crypto = require('crypto') 
, Schema = mongoose.Schema 
, Email = mongoose.SchemaTypes.Email; 


var ContactSchema = new Schema({ 
email: {type: Email, required: true}, 
subject: {type: String, required: true }, 
message: { type: String, required: true}, 
status: {type: Number, required: true, default: 1}, 
contact_time: {type: Date, default: Date.now} 
}); 


module.exports = mongoose.model('contact', ContactSchema); 

裏面的列表action的contact_controller我真的寧願不使用controller = this;我通常更喜歡使用redirect = this.redirect.bind(this);風格的本地化綁定來處理這些情況。

但是,我想不出一種方法來將結果返回給控制器的this對象,而無需創建全局變量版本this並且承諾的回調對話。有沒有更好的方法來返回結果變量或暴露此上下文中的contact_controller對象?

回答

4

你的意思是?

Contact.find({status: 1}, function(err, results) { 
    if (err) { 
    this.redirect(this.urlFor({this: "dashboard", action: "error"})); 
    return; // you should return here, otherwise `render` will still be called! 
    } 
    this.contacts = results; 
    this.render(); 
}.bind(this)); 
^^^^^^^^^^^ here you bind the controller object to the callback function 
+0

這就是我期待的那種簡單。謝謝。 –

+1

robertklep,我剛回到這個問題,我想說謝謝。我在過去幾個月的編碼中發現這種模式非常有用。 –

相關問題