Есть ли способ изменить значения свойств геттерами и сеттерами, используя базу данных области? - PullRequest
0 голосов
/ 27 июня 2018

Используя базу данных области на узле, мне нужно изменить / обрезать значение свойства, например firstName, когда Realm создает человека.

Однако, цитата в документах Realm привлекает мое внимание:

На данный момент поддержка определения моделей с помощью классов ограничена. Это работает в React Native, но не в Node.

Я не уверен, что моя проблема в текущей версии царства v2.8.0.

class Person {
  set firstName(firstName) {
    this._firstName = firstName.trim();
  }
}

Person.schema = {
  name: 'Person',
  properties: {
    firstName: 'string',
    lastName: 'string'
  }
};

// ---

realm.write(() => {
  const john = realm.create('Person', {
    firstName: ' John  ', // <-- need to be trimmed on model
    lastName: 'Smith'
  });
});

Есть ли способ изменить значения свойств геттерами / сеттерами в модели? или есть другая альтернатива?

Другое соображение заключается в том, что Realm создает объекты из модели, и это также приводит к ошибке, если я изменяю их с помощью сеттеров или даже конструктора.

constructor() {
  this.firstName = this.firstName.trim();
}

Невозможно изменить управляемые объекты вне транзакции записи.

Ответы [ 2 ]

0 голосов
/ 11 июля 2018

По сути, открытие области, обернутой пользовательской логикой, такой как конкретная конфигурация и перенесенные схемы:

import Realm from './realm';

let persister = null;

class Person {

  constructor() {
    persister = Realm.open();
  }

  get firstName() {
    return this._firstName;
  }

  set firstName(firstName) {
    this._firstName = firstName.trim();
  }

  async save() {
    try {
      const realm = await persister;
      this.id = uuidv4();
      this.createdAt = Date();
      realm.write(() => {
        realm.create(this.constructor.name, this);
      });

      return this;
    } catch (e) {
      this.handleError(e);
    }
  }

  // ...
}

Установщики / получатели заботятся о значениях свойств, таких как обрезка и т. Д., А асинхронный метод сохраняет объект person в базе данных Realm, как показано ниже:

const person = new Person();
person.firstName = '      John   ';
person.lastName = 'Smith';

person.save().then((p) => {
  console.log(p.firstName); // persisted trimmed firstName
});

// OR within async function:
let p = await person.save();
console.log(p.firstName); // persisted trimmed firstName
0 голосов
/ 27 июня 2018

realm.write(() => {
  const firstName = '  John    ';
  const john = realm.create('Person', {
    firstName: firstName.trim(), // <-- need to be trimmed
    lastName: 'Smith'
  });
});

Перед присвоением значения firstName в методе create сохраните его в другой переменной и обрежьте при присвоении?

...