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

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

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

Что было бы лучшим способом расширить определение моей модели от родителя? Я уже пробовал использовать _.extend(sails.config.model.parentModel, childModel), но, к сожалению, объект sails не отображается глобально (поскольку это делается после загрузки хука orm). Я также мог бы просто require() использовать базовую модель во всех моих моделях и расширить ее.

Каким будет чистый подход, который хорошо сочетается с Sails?


person david.schreiber    schedule 08.01.2014    source источник
comment
Только что узнал, что есть sails.config.model, который объединяется с каждой моделью при нормализации. Имеет ли смысл использовать это в качестве базовой модели при реализации функций жизненного цикла? Моя базовая модель определяет метод toJSON(). Что мне делать, если мои дочерние модели также должны переопределить это?   -  person david.schreiber    schedule 08.01.2014
comment
В настоящее время я слежу за сохранением поведения родителей toJSON() при переопределении.   -  person david.schreiber    schedule 09.01.2014


Ответы (1)


Использование 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
person marionebl    schedule 11.02.2014
comment
Можно ли вызвать родительский метод? Вызов sails.models.toJSON(), как показано ниже, не приведет к ошибке метода, хотя я вижу перечисленную функцию (через console.log). // api/models/second.js module.exports = { attribute: { // Переопределение методов и атрибутов экземпляра toJSON: function() { var somethingElse = Sailes.models.toJSON(); // делаем другие вещи.. return somethingElse; } }, } - person Dida; 29.05.2014