Customizing models(自定义 model)

当使用 slc loopback:model 创建时,就已经开始了自定义 model.

  • loopback 命令行工具 slc loopback:model
  • 自定 model 的 json 文件
    • 使用另一个 model进行继承
    • 其他设置
  • 自定 model 的 js 文件
    • 更改内置方法
    • 通过 boot script
    • 在model 脚本中

Customizing a model using JSON (自定 model 的 json 文件)

文件 common/models/*.json

使用另一个 model进行继承

可以选择一个现有的 model 进行继承,或者从 Loopback 的内置 model 里选择继承类. 在 model.json 里的 base 的属性里设置.

一般来说, 使用PersistedModel为基准模型时,当想要把数据存储到数据库中,可以使用一个连接器.
User Model 作为基础类,它们没有了 CURD 语义 (???)

Customizing other model settings(其他设置)

以下是一些主要配置:

  • plural(复数): 设置为自定义字符串值,而不是默认的标准复数形式
  • strict(严格模式): 设置为 true 时,model 保存一个实例时,实例必须含有定义的属性,而多余的属性也不会存到数据源中.默认false
  • IdInjection(id 注入): 是否自动的添加一个id属性到model 中, 默认 TRUE
  • http.path - 自定义 REST 暴漏路径

Customizing a model with JavaScript code(定义model 在js文件中)

以编程方式扩展模型的基本方法是编辑模型的JavaScript文件中的 common/models/*.js,
模型定义后,脚本立即执行,把脚本作为模型的一部分,用于模型的配置和方法实现.

您还可以添加模型关系, 复杂的验证, 或者某些功能的默认属性: json 文件无法完成的事。

注意, model 里无法直接访问应用程序实例。

你还可以添加自己的 remote 方法 , 或者 model hook 方法。

如果不希望将方法暴漏到 REST 中, 只需要注释掉相应的 remoteMothod()

Change the implementation of built-in methods(更改内置的执行方法)

通过 boot script

当一个 model 通过数据源来做持久性处理,它成为一个持久化模型扩展PersistedModel 以及 Loopback自动赋予了一套CRUD操作内建的方法。

某些需求,要求改变他们的默认行为,可以 通过 boot script 修改:

  1. // /server/boot/script.js
  2. module.exports = function(app) {
  3. var Note = app.models.Note;
  4. var find = Note.find;
  5. var cache = {};
  6. Note.find = function(filter, cb) {
  7. var key = '';
  8. if(filter) {
  9. key = JSON.stringify(filter);
  10. }
  11. var cachedResults = cache[key];
  12. if(cachedResults) {
  13. console.log('serving from cache');
  14. process.nextTick(function() {
  15. cb(null, cachedResults);
  16. });
  17. } else {
  18. console.log('serving from db');
  19. find.call(Note, function(err, results) {
  20. if(!err) {
  21. cache[key] = results;
  22. }
  23. cb(err, results);
  24. });;
  25. }
  26. }
  27. }

Via your model’s script (通过 model 定义脚本修改)

common/models/*.js 对应的文件中修改默认行为

demo

  1. module.exports = function(MyModel) {
  2. // 在附属到数据源之后
  3. MyModel.on('dataSourceAttached', function(obj){
  4. var find = MyModel.find;
  5. MyModel.find = function(filter, cb) {
  6. return find.apply(this, arguments);
  7. };
  8. });
  9. };

other demo:

  1. // 2.0 版本后
  2. Customer.deleteById = function(id, cb) {
  3. // 不执行物理删除
  4. Customer.update({id: id}, {deleted: true}, cb);
  5. }