Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
forked fromgaperton/Type-R

Reactive and serializable objects with transactional changes.

License

NotificationsYou must be signed in to change notification settings

VoliJS/Type-R

 
 

Repository files navigation

master build

Getting started

Type-R is the modern JS data framework to manage complex domain and UI application state. Features:

  • It's mapped to JSON by default. The mapping can handle sophisticated scenarios with nested JSON and relations by id, and can be easily customized for every particular attribute or class.
  • All changes are observable, happens in the scope of transactions, and there's the fine-grained change events system.
  • Validation is performed on the first access to the validation error and never happens twice for unchanged data.
  • Everything is typed at run-time and is protected from improper updates. The shape of generated JSON and data classes is guaranteed to match the definitions.
  • It still looks like regular JS classes and is freaking fast. Type-R data structures are about 10 times faster than Backbone models and collections.

overview

Data layer is defined as a superposition of three kinds of building blocks:

  • Record classes with typed attributes.
  • Orderedcollections of records.
  • Stores are records with a set of collections in its attributes used to resolve id-references in JSON.
  • IOEndpoints is an entity encapsulating I/O transport which represent the persistent collection of records.

Type-R is completely unopinionated on the client-server transport protocol and the view layer technology. It's your perfect M and VM in modern MVVM or MVC architecture.

import{define,Record}from'type-r'// Define email attribute type with encapsulated validation check.constEmail=String.has.check(x=>x!||x.indexOf('@')>=0,'Invalid email');@defineclassUserextendsRecord{staticattributes={name  :String.isRequired,// should not be empty for the record to be valid.email :Email.isRequired}}@defineclassMessageextendsRecord{staticattributes={created :Date//  = new Date()author  :User,// aggregated User record.to      :User.Collection,// aggregating collection of userssubject :'',body    :''}}constmsg=newMessage();assert(!msg.isValid());// Is not valid because msg.author has empty attributes// Listen for the changes in aggregation tree...msg.on('change',()=>console.log('change!!!'));msg.transaction(()=>{// Prepare to make the sequence of changes on msgmsg.author.name='John Dee';// No 'change' event yet as we're in the transaction.msg.author.email='dee@void.com';assert(msg.isValid());// Now msg is valid as all of its attributes are valid.});// Got single 'change!!!' message in the console.

Installation and requirements

Is packed as UMD and ES6 module. No peer dependencies are required.

npm install type-r --save-dev

IE10+, Edge, Safari, Chrome, and Firefox are supportedIE9 and Opera may work but has not been tested. IE8 won't work.

[8]ページ先頭

©2009-2025 Movatter.jp