Показать сообщение отдельно
  #1 (permalink)  
Старый 08.08.2014, 18:33
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

CRUD, или Не все так просто
Здравствуйте.

Я столкнулся с некоторыми странностями при освоении ExtJS5 CRUD. Был бы очень благодарен за подсказки. Итак, мой код:

Ext.define("Communication.model.entity.AoR", {
	extend: "Ext.data.Model",
	idProperty: "id",
	fields: [
		{ name: 'id',
			type: 'int',
			allowNull: true
		},
		"name"
	],
	proxy: {
		type: "ajax",
		reader: {
			type: "json"
		},
		writer: {
			type: "json",
			rootProperty: "data",
			encode: true
		},
		api: {
			create: "/json?cmd=communication.aor.create",
			read: "/json?cmd=communication.aor.read",
			update: "/json?cmd=communication.aor.update",
			destroy: "/json?cmd=communication.aor.destroy"
		}
	}
});

Ext.define("Communication.view.entity.aor.List", {
	extend: "Ext.grid.Panel",
	alias: "widget.entity-aor-list",
	controller: "entity-aor-list",
	title: "My panel",
	viewModel: {
		type: "entity-aor-list"
	},
	columns: [
		{dataIndex: "name", flex: 1, bind: {text: "{hdrName}"}}
	],
	autoLoad: false,
	store: {
		model: "Communication.model.entity.AoR"
	},
	bind: {
		title: "{listTitle}"
	}

});

Ext.define("Communication.view.entity.aor.ListController", {
	extend: "Ext.app.ViewController",
	alias: "controller.entity-aor-list",
	requires: [
		"Ext.Action"
	],
	
	init: function(){
		
		var 
			view = this.getView(),
			store = view.getStore();
			
		store.addListener("load", this.storeLoad, this);
		store.addListener("add", this.storeAdd, this);
		
		// create actions
		this.actionAdd = Ext.create("Ext.Action", {
			text: Communication.L10n.getText("add"),
			disabled: true,
			scope: this,
			handler: this.addItem
		});
		
		this.actionSave = Ext.create("Ext.Action", {
			text: Communication.L10n.getText("save"),
			disabled: true,
			scope: this,
			handler: this.saveData
		});
		
		// add actions
		view.addDocked([
			{ xtype: 'toolbar',
				dock: 'top',
				items: [this.actionAdd, this.actionSave]
			}
		]);
		
		store.load();
	},
	
	addItem: function(){
		var view = this.getView(),
			store = view.getStore(),
			model = new Communication.view.entity.aor.ListModel({
				id: 0,
				name: "Test"
			});
		model.phantom = true;
		model = store.add(model)[0];
	},
	
	storeAdd: function(store, records, index, eOpts){
		this.actionSave.setDisabled(false);
	},
	
	saveData: function(){
		this.getView().getStore().sync();
	},
	
	storeLoad: function(store, records, successful, eOpts){
		this.actionAdd.setDisabled(false);
	}
	
});


Странности начинаются при добавлении записей в стор. Если я не указываю айди при создании модели, или его значение null, то sync() приводит к ошибке: "too much recursion". В примерах, которые мне попадались, я никогда не видел чтоб в новых записях инициализировали айди нулем. Это странность номер один.
Далее, когда я после добавления записи вызываю sync() ничего не происходит. Никаких обращений к серверу. Пытаюсь выставить model.phantom = true - не помогает. Вопрос номер два: как быть?
Еще, новая запись отображается в гриде без этих красных маркеров что показывают состояние dirty. Я пробовал сначала создать запись, а потом посетать поля. Так маркеры отображаются, но... sync() приводит к обращению по адресу update: "/json?cmd=communication.aor.update". Как бы это сделать так, чтобы и новая запись мыла отмаркирована, и операцию происходила правильная?
Ответить с цитированием