Как справиться в 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 в следующей строке, но элемент не существует, следовательно, ничего не отправляется и не выводится.

Другие вопросы по тегам