2014-01-08 2 views
7

Я хочу создать настраиваемый набор атрибутов и методов жизненного цикла, которые разделяются между всеми моделями Sails.js.Наследовать атрибуты и функции жизненного цикла моделей Sails.js

Sails.js автоматически создает и регистрирует объекты модели, вызывая метод Waterline.Collection.extend() и предоставляя определение модели, найденное внутри каталога /api/models.

Что было бы лучшим способом расширить определение моей модели от родителя? Я уже пробовал использовать _.extend(sails.config.model.parentModel, childModel), но, к сожалению, объект sails не выставлен глобально (так как это делается после загрузки крюка орма). Я мог бы просто 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()' вроде следующего получит ошибку «no method», хотя я могу видеть перечисленную функцию (через 'console.log'). // API/модель/second.js module.exports = { атрибутов: { // Переопределение методы экземпляра и атрибуты toJSON: функция() { вар somethingElse = sails.models.toJSON(); // делать другие вещи .. return somethingElse; } }, } – Dida

Смежные вопросы