Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/

React变更 - Node.js SDK

在此页面上

  • 注册 Realm 变更监听器
  • 注册集合变更监听器
  • 注册对象变更侦听器
  • 删除所有变更监听器
  • 变更通知限制

Realm 中的数据是实时的,这意味着对象始终反映其最近保存的状态,并且读取操作永远不会阻塞。 对象会自动更新以响应更改,因此您可以在应用程序中查看最新数据,而无需运行新查询。 对象和查询会发出通知,以便在数据发生变化时更新您的应用程序。

您可以注册三种类型的通知监听器:

  • 每当 Realm 中的任何对象发生变化时,就会触发 Realm 监听器

  • 每当特定查询与一组新对象匹配或任何匹配对象发生变化时,就会触发集合监听器

  • 每当删除特定对象或修改一个或多个属性时,就会触发对象监听器

要为整个域注册变更侦听器,请将回调函数传递给 Realm 的 addListener()方法。 每当操作添加、更改或删除域中的对象时, Realm都会异步调用侦听器。

要移除域监听器,请将回调函数传递给域的 removeListener() 方法。

提示

使用对象和集合监听器获取变更详细信息

Realm 不会将有关更改内容的任何信息传递给 Realm 监听器回调函数。 如果您需要了解有关对象或集合中更改内容的更多信息,请使用对象侦听器和集合侦听器。

提示

处理监听器内部异常

要处理变更侦听器抛出的异常,请将addListener() 调用包装在 try...catch 中 声明。

// Define a listener callback function
function onRealmChange() {
console.log("Something changed!");
}
// Add the listener callback to the realm
try {
realm.addListener("change", onRealmChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listener when you're done!
realm.removeListener("change", onRealmChange);

要为一组 Realm 对象注册变更监听器,请将回调函数传递给集合的 addListener() 方法。Realm 在注册时以及每当操作添加、更改或删除集合中的对象时都会异步调用监听器。

要删除集合监听器,请将回调传递给集合的 removeListener() 方法。

重要

顺序很重要

在集合通知处理程序中,始终按以下顺序应用变更:删除、插入和修改。在删除操作之前处理插入操作可能会导致意外行为。

// You can define a listener for any collection of Realm objects
const dogs = realm.objects("Dog");
// Define a listener callback function for changes to any Dog
function onDogsChange(dogs, changes) {
// Handle deleted Dog objects
changes.deletions.forEach((index) => {
// You cannot directly access deleted objects,
// but you can update a UI list, etc. based on the index.
console.log(`Looks like Dog #${index} has left the realm.`);
});
// Handle newly added Dog objects
changes.insertions.forEach((index) => {
const insertedDog = dogs[index];
console.log(`Welcome our new friend, ${insertedDog.name}!`);
});
// Handle Dog objects that were modified
changes.modifications.forEach((index) => {
const modifiedDog = dogs[index];
console.log(`Hey ${modifiedDog.name}, you look different!`);
});
}
// Add the listener callback to the collection of dogs
try {
dogs.addListener(onDogsChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listener when you're done!
dogs.removeListener(onDogsChange);

要在特定 Realm 对象上注册变更监听器,请将回调函数传递给对象的 addListener() 方法。如果对象的任何属性发生变更或者有人删除了对象,Realm 就会调用监听器。

要移除对象监听器,请将回调函数传递给对象的 removeListener() 方法。

// Define a listener callback function for changes to a specific Dog
function onDogChange(dog, changes) {
if (changes.deleted) {
console.log(`dog is deleted: ${changes.deleted}`);
} else {
changes.changedProperties.forEach((prop) => {
console.log(`* the value of "${prop}" changed to ${dog[prop]}`);
});
}
}
// You can define a listener for any Realm object
try {
dog.addListener(onDogChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listeners when you're done!
dog.removeListener(onDogChange);

要删除给定 Realm、对象或集合实例上的所有监听器,请调用实例的 removeAllListeners() 函数:

// Remove all listeners from a realm
realm.removeAllListeners();
// Remove all listeners from a collection
dogs.removeAllListeners();
// Remove all listeners from an object
dog.removeAllListeners();

嵌套文档中深度超过四级的变更不会触发变更通知。

如果您的数据结构需要侦听第五层深度或更深层的更改,解决方法包括:

  • 重构模式以减少嵌套。

  • 添加“推送以刷新”一类的内容,使用户能够手动刷新数据。

后退

查询数据