Skip to content
Vitalii Vorobioff edited this page Nov 14, 2016 · 9 revisions

Структура данных модели имеет следующий формат:

{
	__waiting: {}, // тут хранятся ключи асинхронных действий состояния ожидания
	__failed: {} // тут хранятся ключи асинхронных действий для состояния ошибок
}

__waiting и __failed предназначены для хранения состояний асинхронных действий. Асинхронные действия могут быть в трех состояниях: waiting, failed и формально - success. При переходе в каждое из состояний нужно переключить остальные, для этого есть специальные методы.

Пример модели с использованием асинхронных действий

//model.js

import {Model as BasicModel} from 'react-redux-mvc';

export default class UserModel extends BasicModel {
	static shape = {
		userData: {
			name: {
				first: '',
				last: ''
			},
			age: null,
			department: '',
			email: '',
			phone: ''
		},
		errorMsg: null
	};
	
	constructor(state){
		super(state);
	}

	onLoadWaiting () {
		return this
			.setWaiting('loadUserData')
			.resetFailed('loadUserData')
			.getState();
	}
	
	onLoadFailed (errorMsg) {
		return this
			.setWaiting('loadUserData')
			.resetFailed('loadUserData')
			.updateState({errorMsg})
			.getState();
	}
	
	onLoadComplete (result) {
		return this
			.resetWaiting('loadUserData')
			.updateState({userData: result})
			.getState();
	}
}


//actions.js
import {createAction} from 'easy-redux';
import UserModel from './model';

const loadUserData = createAction('loadUserData', {
	async: true,
	storeKey: 'user',
	initialState: Object.assign({}, UserModel.shape),
	action: userId => ({userId}),
	handlers: {
		onWait: state => new UserModel(state).onLoadWaiting(),
		onFail: (state, {error}) => new UserModel(state).onLoadError(error),
		onSuccess: (state, {result}) => new UserModel(state).onLoadComplete(result)
	}
}); 	

Детально о них будет ниже

API

static shape:Object - описание типов данных модели

import {Model} from 'react-redux-mvc';
import {PropTypes} from 'react';

class MyModel extends Model {
	static shape = {
		name: PropTypes.string.isRequired,
		age: PropsTypes.number
	};
}

static defaults:Object - значения по умолчанию

import {Model} from 'react-redux-mvc';

class MyModel extends Model {
	static defaults = {
		name: '',
		age: 0
	};
}

getState (prop:String) - Возвращает полное состояние модели, или только отдельное его свойство - prop

import UserModel from './model';
const {getState as reduxGetState} = store;

const user = new UserModel(reduxGetState()['user']);
const userName = user.getState('name'); 
const userState = user.getState();

Также можно получить вложенное свойство

const user = new UserModel(getState());
const userName = user.getState('name.first');

update (updates:Object) - Обновляет состояний модели, путем сливания (merge) с объектом updates

const userData = {
	name: {
		first: 'John',
		last: 'Doe'
	},
	Age: 23,	
};

const user = new UserModel(userData);
let lastName = user.getState('name.last');
console.log(lastName); // Doe
lastName = user.update({name:{last: 'Brown'}}).getState('name.last');
console.log(lastName); // Brown

Возвращает контекст this

set(prop:String || Object, value: Any) - Устанавливает значение состояния модели. У этого метода две реализации:

  1. Устанавливает свойство prop в value
	const user = new UserModel(getState());
	user.set('department', 'IT');
  1. Устанавливает целый объект свойств
	const user = new UserModel(getState());
	user.set({
		'email': 'john_doe@email.com',
		'phone': '+7-916-666-66-66'
		'department', 'IT',
	});

Методы для работы с асинхронными действиями (async actions)

Все состояния хранятся в объекте парами. Например:

	//ожидающие
	waiting: {
		loadData: true,
		login: false,
		update: false,		
	}
	//с ошибкой
	waiting: {
		loadData: false,
		login: false,
		update: false,		
	}	

Соответственно все операции осуществляются в рамках этих объектов

setWaiting(actionName:String) - Устанавливает состояние actionName как ожидающее (true)

resetWaiting(actionName:String) - Сбрасывает состояние actionName как ожидающее (false)

setFailed(actionName:String) - Устанавливает состояние actionName как с ошибкой (true)

resetFailed(actionName:String) - Устанавливает состояние actionName как с ошибкой (false)

isWaiting(actionName:String) - Проверяет находится ли действие actionName в статусе ожидания

isFailed(actionName:String) - Проверяет находится ли действие actionName в статусе ошибки

getWaiting() - Возвращает весь объект с состояниями ожидания

getFailed() - Возвращает весь объект с состояниями ошибки

Clone this wiki locally