2016-06-16 2 views
4

Я хочу создать записи Immutable.js, которые имеют (более или менее) уникальный ключ. Что-то вроде этого:Immutable.js Запись с (по умолчанию) уникальным идентификатором

import { Record } from 'immutable' 

var MyRecord = Record({ 
    key: Math.random().toString(), 
    name: "" 
}) 

Возможно ли это? Я пробовал, и все записи имеют один и тот же ключ. Я импортировать MyRecord как это:

import { MyRecord } from '../model/MyRecord' 

и создавать новые записи, как этот

var r = new MyRecord(data) 

где data является объектом JSON.

Я мог бы добавить ключ вручную после создания новой записи, но я бы предпочел найти способ автоматизировать это.

+3

Престола [этот ответ] (http://stackoverflow.com/a/34922916/893780). – robertklep

+0

@robertklep Это работает, спасибо! (если вы ответите, я соглашусь) –

+0

Это не мой ответ на самом деле ;-) – robertklep

ответ

0

Вы можете попробовать это:

function createMyRecord (data){ 
    let record = new MyRecord(data) 

    return record.set('key', Math.random().toString()) 
} 
0

Спасибо за большой вопрос, и благодаря @robertklep для ведущих меня к этому ответу, ссылаясь на это: How to construct subclasses of Immutable.Record?

Адаптирование, что ответ на работу с id с немного отличается: если в записи есть id, он не будет генерировать один.

Это единственное изменение действительно.

// https://gist.github.com/jed/982883 
 
// this can be any function that returns a string 
 
function uuid(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,uuid)} 
 

 
// this is the implementation you need 
 
class MyRecordWithId extends Immutable.Record({ 
 
    id: '', // purposely have this empty string 
 
    a: 'some a', 
 
    b: 'some b' 
 
}) { 
 
    constructor(props) { 
 
    super(Object.assign({}, props, {id: (props && props.id) || uuid()})) 
 
    } 
 
} 
 

 
// this is a test to see the ID 
 
const myRecord = new MyRecordWithId(); 
 
console.log('first record id: ', myRecord.id); 
 

 
// these are tests to see if we can serialize the record and check if the ID is the same 
 
const json = JSON.stringify(myRecord.toJS()); 
 
const js = JSON.parse(json); 
 

 
const shouldHaveTheSameId = new MyRecordWithId().merge(Immutable.fromJS(js)); 
 

 
console.log('serialized id: ',shouldHaveTheSameId.id); 
 

 
console.log('are the IDs the same?: ', myRecord.id === shouldHaveTheSameId.id ? 'yes' : 'no'); 
 

 
console.log('different id: ', new MyRecordWithId().id);
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

Смежные вопросы