2014-01-08 75 views
7

我想創建一組自定義的屬性和生命週期方法,這些方法在我所有的Sails.js模型之間共享。Sails.js模型的繼承屬性和生命週期函數

Sails.js通過調用Waterline.Collection.extend()方法並提供/api/models目錄中的模型定義來自動創建和註冊模型對象。

什麼是從父母擴展我的模型定義的最佳方法?我已經嘗試過使用_.extend(sails.config.model.parentModel, childModel),但遺憾的是sails對象沒有全局公開(因爲這是在加載orm掛鉤後完成的)。我也可以在我的所有模型中簡單地使用require()基本模型並對其進行擴展。

什麼是一種乾淨的方法,與Sails相得益彰?

+0

剛剛發現有'sails.config.model'被合併而正火每個模型。在實現生命週期功能時將它用作基本模型是否有意義?我的基本模型定義了'toJSON()'方法。當我的孩子模型需要重寫這個時,我應該怎麼做? –

+0

目前,我正密切關注如何在覆蓋時保持父母對JSON()行爲的完整性。 –

回答

10

使用config/models.js爲模型提供全局默認值是完全有效的。關於壓倒一切的實例和類方法,根據我的測試,沒有什麼值得注意的。在模型定義中定義sails.config.models中的屬性/方法將覆蓋此模型的屬性/方法,而不定義它。

定義

// config/models.js 
module.exports.models = { 
    attributes: { 
    // base model instanceMethod 
    toJSON: function() { 
     console.log('base.toJSON'); 
     return this.toObject(); 
    } 
    }, 

    // base model classMethod 
    test: function() { 
    console.log('base.test'); 
    } 
}; 


// api/models/first.js 
module.exports = { 
    attributes: { 

    }, 

    // Overriding classMethods and lifecycle callbacks 
    test: function() { 
    console.log('first.test'); 
    } 
}; 

// api/models/second.js 
module.exports = { 
    attributes: { 
    // Overriding instance methods and attributes 
    toJSON: function() { 
     console.log('second.toJSON'); 
     return this.toObject(); 
    } 
    }, 
} 

測試

> sails.models.first.test(); 
>'first.test' // sails.config.models.test overridden 

> sails.models.first.findOne(1).exec(err,res){ res.toJSON(); }); 
> 'base.toJSON' // sails.config.models.attributes.toJSON not overridden 

> sails.models.second.test(); 
> 'base.test'; // sails.config.models.test not overridden 

> sails.models.second.findOne(1).exec(err,res) { res.toJSON(); }); 
> 'second.toJSON' // sails.config.models.attributes.toJSON overridden 
+2

是否可以調用父方法?儘管我可以看到列出的函數(通過console.log),但調用'sails.models.toJSON()'將會得到「無方法」錯誤。 // API /模型/ second.js module.exports = { 屬性:{// 重寫實例方法和屬性的toJSON :函數(){ VAR somethingElse = sails.models.toJSON(); //做其他事情。 return somethingElse; } }, } – Dida