Immutable.js记录(默认)唯一ID

时间:2016-06-16 08:53:22

标签: javascript immutable.js

我想创建具有(或多或少)唯一键的Immutable.js记录。像这样:

$ongkir

这可能吗?我试过了,所有记录都有相同的密钥。我这样导入import { Record } from 'immutable' var MyRecord = Record({ key: Math.random().toString(), name: "" })

MyRecord

并创建像这样的新记录

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

其中var r = new MyRecord(data) 是json对象。

我可以在创建新记录后手动添加密钥,但我更愿意找到一种自动化方法。

2 个答案:

答案 0 :(得分:1)

感谢@robertklep提出这个问题,并提出这个答案:How to construct subclasses of Immutable.Record?

将该答案与id s配合使用略有不同:如果记录中有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>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

你可以试试这个:

<div id="mergeType" class="btn-group">
    <label for="radio1" class="btn btn-sm btn-success">
        <input type="radio" name="mergeType" id="radio1" value="OVW">Überschreiben
    </label>
    <label for="radio2" class="btn btn-sm btn-success">
        <input type="radio" name="mergeType" id="radio2" value="ADD">Hinzufügen
    </label>
    <label for="radio3" class="btn btn-sm btn-success">
        <input type="radio" name="mergeType" id="radio3" value="KEE">Gefunde behalten
    </label>
    <label for="radio4" class="btn btn-sm btn-success">
        <input type="radio" name="mergeType" id="radio4" value="DEL" checked="checked">Gefundene entfernen
    </label>
</div>