Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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". Как бы это сделать так, чтобы и новая запись мыла отмаркирована, и операцию происходила правильная?
Ответить с цитированием
  #2 (permalink)  
Старый 11.08.2014, 07:07
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

Сообщение от Infarch Посмотреть сообщение
Если я не указываю айди при создании модели, или его значение null, то sync() приводит к ошибке: "too much recursion". В примерах, которые мне попадались, я никогда не видел чтоб в новых записях инициализировали айди нулем.
похоже тут ваши желания идут поперек планов сенчи. с 5й версии они решили что поле id модели должно быть все время заполнено ..они теперь кладут туда по умолчанию сгенерированное значение. возможно отсюда ваши проблемы ..не обнуляйте id.

еще ..я посмотрел на код ..вы создаете экземпляры моделей с одним и тем же значением id:
store = view.getStore(),
			model = new Communication.view.entity.aor.ListModel({
				id: 0, // зачем?
				name: "Test"
			});

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

Последний раз редактировалось siber-biber, 11.08.2014 в 07:10.
Ответить с цитированием
  #3 (permalink)  
Старый 11.08.2014, 12:08
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Ну а что мне там написать при создании новой записи? Айди будет сформирован сервером при вставке в базу. А если я его тут не указываю, то возникает ошибка sync().

Сообщение от Infarch
Далее, когда я после добавления записи вызываю sync() ничего не происходит. Никаких обращений к серверу. Пытаюсь выставить model.phantom = true - не помогает. Вопрос номер два: как быть?
А про это что нибудь посоветуете?
Ответить с цитированием
  #4 (permalink)  
Старый 11.08.2014, 12:56
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Все, вопрос снят ) Сам виноват, неправильно указал имя модели при создании. Это вьюмодель, а не данные. Поправил, sync заработал.
Ответить с цитированием
  #5 (permalink)  
Старый 11.08.2014, 19:20
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

Сообщение от Infarch Посмотреть сообщение
Ну а что мне там написать при создании новой записи? Айди будет сформирован сервером при вставке в базу. А если я его тут не указываю, то возникает ошибка sync().
вот именно что указывать его не надо, и ошибки при этом быть не должно
Ответить с цитированием
  #6 (permalink)  
Старый 12.08.2014, 11:06
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Ну так я уже написал - сам ошибся ) Теперь все работает.

Кстати, на этом форуме можно закрывать темы?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06
Как сделать, чтобы музыка <embed> на странице не играла только при первом посещении? Bad Request Общие вопросы Javascript 22 27.07.2009 19:44
Возможна ли смена типа созданного объекта в Javascript? phprus Общие вопросы Javascript 9 04.07.2009 02:41
Всё должно быть просто, но, блин, не получается!... parzh-junior Элементы интерфейса 2 14.06.2009 18:37
Сторонние библиотеки - быть или не быть? IIIEPJIOK Оффтопик 64 21.03.2009 19:39