Spraypaint the isomorphic, framework-agnostic Graphiti ORM

Dirty Tracking

When an attribute has been modified, but has not yet been saved to the server, it is considered “dirty”. Use #isDirty() to see if any attribute is dirty, use the #changes() method to see all dirty attributes.

Typescript
Javascript
  let post = await Post.first()
  post.title // "original"
  post.isDirty() // false
  post.changes() // {}

  post.title = "changed"
  post.isDirty() // true
  post.changes() // { title: ["original", "changed"] }

  await post.save()
  post.isDirty() // false
  post.changes() // {}
  
  Post.first().then(function(response) {
    var post = response.data;

    post.title; // "original"
    post.isDirty(); // false
    post.changes(); // {}

    post.title = "changed";
    post.isDirty(); // true
    post.changes(); // { title: ["original", "changed"] }

    post.save().then(function(success) { // true
      post.isDirty(); // false
      post.changes(); // {}
    });
  });
  

Remember, only dirty attributes are sent to the server when #save() is called.

#isDirty() can take into account relationships - just pass a string, array, or object or relationship names. A relationship is considered dirty if:

  • Any objects in the relationship have dirty attributes
  • An object was removed from a hasMany relationship
  • An object was added to a hasMany relationship
  • Any object within the relationship was replaced with a different object.
Typescript
Javascript
  let post = await Post.first()
  post.comments[0].text = "my comment"
  post.isDirty("comments") // true

  post = await Post.first()
  post.comments.push(new Comment())
  post.isDirty("comments") // true

  post = await Post.first()
  post.comments.splice(1, 1)
  post.isDirty("comments") // true

  post = await Post.first()
  post.blog // an existing Blog instance
  post.blog = (await Blog.first()).data
  post.isDirty("blog") // true

  // check nested relationships
  post.isDirty(["blog", { comments: "author" }])
  
  Post.first().then(function(response) {
    var post = response.data;
    post.comments[0].text = "my comment";
    post.isDirty("comments"); // true
  });

  Post.first().then(function(response) {
    var post = response.data;
    post.comments.push(new Comment());
    post.isDirty("comments"); // true
  });

  Post.first().then(function(response) {
    var post = response.data;
    post.comments.splice(1, 1);
    post.isDirty("comments"); // true
  });

  Post.first().then(function(response) {
    var post = response.data;
    post.blog; // an existing Blog instance

    Blog.first().then(function(blog) {
      post.blog = (await Blog.first()).data
      post.isDirty("blog") // true
    });
  });

  // check nested relationships
  post.isDirty(["blog", { comments: "author" }])
  

If you need to reset dirty tracking, call #reset()

Typescript
Javascript
  let post = await Post.first()
  post.title // "original"
  post.title = "changed"
  post.isDirty() // true
  post.reset()
  post.title // "changed"
  post.isDirty() // false
  Post.first().then(function(post) {
    post.title; // "original"
    post.title = "changed";
    post.isDirty() // true
    post.reset();
    post.title; // "original"
    post.isDirty() // false
  });