Defining mixins(定义 mixins)

  • mixin 简介
    • 内置 model 的 mixins
  • 创建一个 mixin 脚本
  • 在 model-config.js 引入 mixins
  • 启动 model 的 mixins

Overview 简介

使用 mixin 可以将一组公共逻辑添加到 Model 中,
例如 一个 timestamp mixin
将为 model 注入 created(创建时间)modified(修改时间) 两个属性,并维护响应逻辑.

也可以使用 mixin 扩展内置 model

内置 model 的 mixins 方法

基本 model

默认情况下,基本的 Loopback 具有 mixin 属性和方法通过以下方式:

  • Inclusion object (包含对象)
  • Validateable object

Connected model

处理包括 基本 model 的方法,当 model 连接到 datasource 时:

  • RelationMixin class
  • PersistedModel class

创建一个 mixin 脚本

mixin 是一个 js 文件,位于以下几个目录中, 防止的目录取决于 mixin 的范围:

  • common/mixins/mixinName.js 例如: common/mixins/timeStamp.js
  • server/mixins/mixinName.js

如果需要在客户端和服务端中使用,那么放置在 common ,如果仅适用于服务器那么放置在 server 中.

以上目录只是建议, 也可以在 model-config.js 中设置自定义目录

可以使用 mixin 对不同的 model 进行相同的 方法和 增加模型定义

例如:

common/mixins/timestamp.js

  1. module.exports = function(Model, options) {
  2. // Model is the model class
  3. // options is an object containing the config properties from model definition
  4. Model.defineProperty('created', {type: Date, default: '$now'});
  5. Model.defineProperty('modified', {type: Date, default: '$now'});
  6. }

上述 mixin 代码添加了 两个属性 created,modified, 并设置了 类型, 相同与设置 model.json文件

以下代码, 使得所使用mixin 的 Model, 扩展了一个 before save 钩子

  1. module.exports = function(Model, options) {
  2. 'use strict';
  3. Model.observe('before save', function event(ctx, next) { //Observe any insert/update event on Model
  4. if (ctx.instance) {
  5. ctx.instance.squirrel = true;
  6. } else {
  7. ctx.data.squirrel = true;
  8. }
  9. next();
  10. });
  11. };

Reference mixins in model-config.js(在 model-config.js 引入 mixins)

server/model-config.js文件

  1. {
  2. "_meta": {
  3. "sources": [
  4. "loopback/common/models",
  5. "loopback/server/models",
  6. "../common/models",
  7. "./models"
  8. ],
  9. "mixins": [
  10. "loopback/common/mixins",
  11. "loopback/server/mixins",
  12. "../common/mixins",
  13. "path/to/other/mixins", // 添加自定义的 mixin
  14. "./mixins"
  15. ]
  16. },
  17. ...
  18. }

Enable a model with mixins(激活 model 的 mixin 属性)

在一个 model 中启用 mixin ,需要在 model 定义的 json 文件中,添加一个 mixin 属性,
mixin 是一个 对象, 对象的 key 值为 mixin 的名字(文件名, 驼峰转换), 对应的值将作为 option 传入 mixin 作为混入时的参数.

  1. {
  2. "name": "note",
  3. "base": "PersistedModel",
  4. ...
  5. "mixins": {
  6. "Timestamp": {
  7. "myOption": 1,
  8. "anotherOpt": 2
  9. }
  10. },
  11. "properties": {
  12. ...
  13. },
  14. ...
  15. }

如上: common/mixins/timestamp.js

  1. module.exports = (Model, options) => {
  2. // 在 note model 的混合中
  3. // options === {"myOption": 1,"anotherOpt": 2};
  4. // coding
  5. }

相关 mixin 列表