【问题标题】:Property setters and getters in Loopback.ioLoopback.io 中的属性设置器和获取器
【发布时间】:2016-05-05 23:51:02
【问题描述】:

我想知道使用模型类中的 settergetter 属性有多安全。

这已经在环回用户模型中使用,可以在这里看到:User Code

为什么在任何地方都没有记录?可以用吗?

【问题讨论】:

    标签: loopbackjs setter getter strongloop


    【解决方案1】:

    我仍在寻找“官方”文档,但我们的主要工程师在此处的另一个 SO 答案中记录了它:https://stackoverflow.com/a/24253273/52160

    如果我能在文档中找到官方支持,我会更新问题。

    【讨论】:

    • 感谢您的回答!我已经看到了。我想知道是否有人可以正式验证它......无论如何,我会保持这个问题的开放,直到它完全验证......
    【解决方案2】:

    其实,经过一些更深的挖掘,我发现这实际上是在loopback-datasource-juggler模块的ModelBuilder类中使用和定义的。 定义为here

    ModelClass.setter = {};

    并使用here

    Object.defineProperty(ModelClass.prototype, propertyName, {
      get: function() {
        if (ModelClass.getter[propertyName]) {
          return ModelClass.getter[propertyName].call(this); // Try getter first
        } else {
          return this.__data && this.__data[propertyName]; // Try __data
        }
      },
      set: function(value) {
        var DataType = ModelClass.definition.properties[propertyName].type;
        if (Array.isArray(DataType) || DataType === Array) {
          DataType = List;
        } else if (DataType === Date) {
          DataType = DateType;
        } else if (DataType === Boolean) {
          DataType = BooleanType;
        } else if (typeof DataType === 'string') {
          DataType = modelBuilder.resolveType(DataType);
        }
    
        var persistUndefinedAsNull = ModelClass.definition.settings.persistUndefinedAsNull;
        if (value === undefined && persistUndefinedAsNull) {
          value = null;
        }
    
        if (ModelClass.setter[propertyName]) {
          ModelClass.setter[propertyName].call(this, value); // Try setter first
        } else {
          this.__data = this.__data || {};
          if (value === null || value === undefined) {
            this.__data[propertyName] = value;
          } else {
            if (DataType === List) {
              this.__data[propertyName] = DataType(value, properties[propertyName].type, this.__data);
            } else {
              // Assume the type constructor handles Constructor() call
              // If not, we should call new DataType(value).valueOf();
              this.__data[propertyName] = (value instanceof DataType) ? value : DataType(value);
            }
          }
        }
      },
      configurable: true,
      enumerable: true,
    });
    

    所以它可能已经实现,但没有记录......

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多