Как справиться в Play! фреймворк пост формы с jsAction?
Я борюсь с этим в течение некоторого времени безрезультатно. Я хочу, чтобы данные, введенные в форму и отправленные, отображались в виде новой строки таблицы, находящейся на той же странице (без перезагрузки страницы). В настоящее время у меня есть модель элемента с несколькими полями, контроллер с saveItem
действие:
public static void saveItem(@Valid SoldItem item) {...
и, конечно, форма:
<tr class="itemNew">
<td>
<input type="image" id="saveItem" name="&{'Save'}" alt="&{'Save'}" height="16" src="/public/images/001_06.png" form="itemsTable"/>
<a href="#/cancelEdits"><image id="cancelEdits" src="/public/images/001_05.png" alt="&{'Cancel'}" title="&{'Cancel'}" height="16"></a>
</td>
<td>
<div class="item">
<input class="itemDesc" type="text" size="30" name="item.item.name" placeholder="&{'item.name'}" />
</div>
<div class="item">
<textarea class="itemDesc" rows="2" cols="30" name="item.item.description" placeholder="&{'item.description'}" ></textarea>
</div>
</td>
....
с некоторым JavaScript:
this.post('#/saveItem', function (context) {
var item_def = new Sammy.Object();
context.log('saveItem - params = ' + this.params);
context.log('saveItem - form_fields = {');
//for ( var item in this.params.keys()) {
var items = this.params.keys(true);
for ( var i = 0; i < items.length; i++) {
var item = items[i];
context.log('item: ' + item);
if(item.match(/^item\./)) {
item_def[':'+ item] = this.params[item];
}
}
context.log('}');
context.log('item_def: ' + item_def);
var action = #{jsAction @Invoices.saveItem(item_def) /};
context.log('action: ' + action({item: item_def}));
this.partial(action({item: item_def}));
});
Последний является Sammy.js
фрагмент, но это, похоже, не имеет отношения к делу. То, что я получаю, совершенно ничего. Вот пример двух последних записей журнала:
[Fri Jun 10 2011 01:30:51] item_def: Sammy.Object: {":item.item.name": aaa,":item.item.description": dsfsd,":item.retailPrice": dsfs,":item.rebate": sdf,":item.quantity": dsf,":item.vatRate": d,":item.notes": ds}
[Fri Jun 10 2011 01:30:51 ] action: /invoices/saveitem
Документация jsAction
не касается такой проблемы, и я не смог найти ни одного примера, поэтому, пожалуйста, помогите мне с этим.
2 ответа
Итак, решение, которое я придумал:
this.post('#/saveItem', function (context) {
var items = this.params.toHash();
var action = #{jsAction @Invoices.saveItem() /};
this.send($.post, action(), items)
.then(function(contents) {
this.swap(contents);
});
});
Некоторое объяснение я нашел в группе playframework. При публикации из формы нет необходимости создавать полный URL-адрес запроса. Все параметры должны быть отправлены как тело сообщения. В приведенном выше примере показано использование фреймворка Sammy.js (в фреймворке Play!), И он работает довольно хорошо.
Я думаю, что эта строка неверна
var action = #{jsAction @Invoices.saveItem(item_def) /};
так должно быть
var action = #{jsAction @Invoices.saveItem(item) /};
Вы назначаете item_def
в item
в следующей строке, но элемент не существует, следовательно, ничего не отправляется и не выводится.