2013-06-27 6 views
2

Итак, скажите, что у меня есть серверный сервер, поэтому мы делаем все удаленное. Пример магазинов:ExtJS 4.2: Несколько вложений

Ext.create('Ext.data.Store', { 
     model: 'MyApp.model.ContactModel', 
     remoteFilter: true, 
     remoteSort: true, 
     autoLoad: true, 
     autoSync: true, 
     storeId: 'ContactStore-1' 
    }); 
    Ext.create('Ext.data.Store', { 
     model: 'MyApp.model.ContactModel', 
     remoteFilter: true, 
     remoteSort: true, 
     autoLoad: true, 
     autoSync: true, 
     storeId: 'ContactStore-2' 
    }); 

я ударил проблема, когда я делаю следующее:

Ext.getStore('ContactStore-1').insert(0,{'name':'say'}); 
Ext.getStore('ContactStore-2').insert(0,{'name':'hi'}); 

Что происходит, что, когда я смотрю на БД я в конечном итоге с 2 записей. Я получаю «привет» один раз и «говорю» дважды. Из его взглядов происходит то, что первый оператор insert отправляется, а затем отправляется второй оператор insert, но с данными из обеих вставок (я предполагаю, что они имеют одну и ту же модель и, следовательно, тот же самый прокси)

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

Модель для Вашего удовольствия:

Ext.define('MyApp.model.ContactModel', { 
extend: 'Ext.data.Model', 

idProperty: 'idContact', 

fields: [ 
    { 
     name: 'idContact', 
     type: 'int' 
    }, 
    { 
     name: 'name', 
     type: 'string' 
    } 
], 

proxy: { 
    type: 'direct', 
    api: { 
     create: contact.createRecord, 
     read: contact.getResults, 
     update: contact.updateRecords, 
     destroy: contact.destroyRecord 
}, 
    reader: { 
     type: 'json', 
     root: 'data' 
    } 
} 
}); 
+0

Что произойдет, если вы переместите прокси-сервер в магазин? – existdissolve

+0

Как смена прокси-сервера в магазине изменит ситуацию? Из того, что я вижу в сообщениях, даже когда вызывается 2 разных модели, они иногда группируются в один массивный вызов. –

+0

Боковое примечание: я сделал это и попробовал, и это не сработало =/Как я полагал, он все еще собирает все звонки вместе. –

ответ

1

Я думаю, что вы не возвращает правильные данные на стороне сервера на создание. Если вы не вернете идентификатор сервера, созданного на первой вставке, ExtJS по-прежнему будет считать, что ваш элемент «say» равен phantom. То есть, он еще не был сохранен на стороне сервера.

Когда вы делаете вторую вставку, в магазине будет выполняться синхронизация при включенной автосинхронизации. Синхронизация отправит ВСЕ ожидающие изменения. Поскольку ваш «привет» элемент новый, который будет отправлен в POST, как ожидается. Но так как ваш предыдущий элемент «привет» не имеет идентификатора сервера и по-прежнему является фантомом, он также будет отправлен в POST с вашей второй синхронизацией (вызванной вставкой).

В основном сервер должен вернуть новый идентификатор с результатом набора результатов, чтобы ExtJS знал, что элемент был сохранен сервером. Вот пример из моего REST API:

Запрос имеет эту полезную нагрузку (см. Вкладку «Сеть инструментов разработчика Chrome»).

POST to http://localhost:8081/api/channel?_dc=1372594759864 

{"id":0,"number":0,"name":"test"} 

Это ответ сервера (200 OK):

{ 
    "result": { 
    "id": 4, // <- important 
    "number": 3, 
    "name": "test", 
    }, 
    "success": true, 
    "location": "http://localhost:8081/api/item/4", 
    "userMessage": null, 
    "userTitle": "Success", 
    "devErrors": null 
} 

Все поля в модели обновляются данные в ответе сервера, а также такие ваши привет и сказать детали будут получать их идентификатор сервера. Когда идентификатор установлен, для свойства phantom установлено значение false. Вы можете просмотреть js-файл Ext.data.Model для исходного кода для этого, если хотите углубиться. :)

В вашем случае у вас должно быть idContact в возвращаемом объекте, так как это вы idProperty.

Если вы хотите приостановить автоматическую синхронизацию, выполните свои вставки и синхронизацию вручную, а затем снова включите автосинхронизацию, вы можете использовать SuspendAutoSync и ResumeAutoSync.

Самый лучший способ добавить модели в магазины, на мой взгляд, - это создать свою модель, сохранить ее и успешно положить в магазин. Это требует наличия прокси-сервера в каждой модели. Это будет выглядеть примерно так:

var hi = Ext.create('MyApp.model.ContactModel', { 
    name: 'hi' 
}); 

hi.save({ 
    success: function (record, operation) { 
     Ext.getStore('ContactStore-1').add(hi); 
     // You could do your second insert here that is dependent on the first to be completed 
    }, 
    failure: function (record, operation) { 
     Ext.MessageBox.alert("Error", "Could not save model at this time..."); 
    }, 
    scope: this 
}); 

Таким образом, вы можете добавить второй пункт в обработчике успеха сохранить первый элемент х.

+0

Я думаю, что это может помочь мне создать работу, но проблема в том, что я отправляю вставки один за другим, поэтому мне не нужно «ждать», чтобы гарантировать, что данные были выполнены. Есть ли способ отключить автосинхронизацию на мгновение, чтобы «сохранить» все вставки, а затем синхронизировать все сразу? –

+0

Думаю, я тоже, возможно, не понимаю его должным образом. Когда я смотрю на сообщения, оба вставки происходят всего за один вызов (один пост-запрос), но в запросе на сообщение есть 2 запроса. Первый из них просто «говорит» в нем, а второй имеет как «сказать», так и «привет». Это, я думаю, странная часть. Если он делает один вызов, а затем делает второй вызов с обоими из-за того, что первый из них является фантомом, который будет иметь смысл, но он делает это в одном вызове ... –

+0

Как выглядит ваш ответ сервера для вызовов? Скопируйте вставить ответ на вкладку ответа в свой вопрос. – oldwizard