2014-01-08 17 views
7

私のすべてのSails.jsモデル間で共有される属性とライフサイクルメソッドのカスタムセットを作成したいと考えています。Sails.jsモデルの属性とライフサイクル機能を継承する

Sails.jsは、Waterline.Collection.extend()メソッドを呼び出し、/api/modelsディレクトリ内にあるモデル定義を提供することによって、モデルオブジェクトを自動的に作成して登録します。

モデル定義を親から拡張するにはどうすればよいでしょうか?私はすでに_.extend(sails.config.model.parentModel, childModel)を使ってみましたが、悲しいことに、オブジェクトはグローバルに公開されていません(これはormフックのロード後に行われるためです)。私は単にrequire()のすべてのモデルのベースモデルとそれを拡張することもできます。

セイルとうまくいくきれいなアプローチは何でしょうか?

+0

ちょうど正規化しながら、各モデルにマージされ、 'sails.config.model'があることが分かりました。ライフサイクル機能を実装する際にこれをベースモデルとして使用するのは理にかなっていますか?私の基本モデルは 'toJSON()'メソッドを定義しています。子モデルがこれをオーバーライドする必要があるとき、私は何をすべきですか? –

+0

現在、私は、オーバーライド時に親の 'toJSON()'ビヘイビアをそのまま維持することに注意しています。 –

答えて

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

親メソッドを呼び出すことはできますか?次のように 'sails.models.toJSON()'を呼び出すと、 'console.log'を使ってリストされた関数を見ることができますが、"メソッドなし "エラーが発生します。 // API /モデル/ second.js = { 属性module.exportsは:{ //オーバーライドインスタンスメソッドと属性 toJSON:関数(){ VAR somethingElse = sails.models.toJSON()。 //他のものを行う.. return somethingElse; } }、 } – Dida

関連する問題