Рельсы 3 и Формтастик. Как отображать поля в соответствии с выбором (ajax)?

Если у меня есть отправления, у каждого отправления есть один из четырех возможных режимов. Когда я хочу создать счет-фактуру, я иду в «Новый счет-фактуру», выбираю отгрузку из меню выбора (для какой отправки предназначен счет-фактура). Если выбранное отправление имеет режим А, то в форме будут отображаться некоторые поля; Если выбранное отправление имеет режим B, то будут отображаться некоторые другие поля.

Все, что мне нужно, это чтобы в форме «Новый счет-фактура», когда кто-то выбрал отправку, найти режим доставки (shipment.mode).


person leonel    schedule 29.12.2011    source источник
comment
Вместо ajax вы можете добавить это содержимое при создании формы и скрыть или показать поля в соответствии с выбранным режимом доставки.   -  person Pritesh Jain    schedule 29.12.2011


Ответы (1)


Вы можете реализовать это примерно так:

Ваше мнение:

<div data-shipment-mode="A" style="display:none;">
    fields that should only be shown for shipment mode A
</div>
<div data-shipment-mode="B" style="display:none;">
    fields that should only be shown for shipment mode B
</div>

Ваш JavaScript:

$(document).ready(function() {
    $('id-of-shipment-select-menu').change(function() {
        var successHandler = function(data) {
            var mode = data.mode;
            $("div[data-shipment-mode!=" + mode + "]").hide();
            $("div[data-shipment-mode=" + mode + "]").show();
        };

        var shipmentId = $(this).val();
        /* replace service_url with the appropriate controller/action */
        $.getJSON("/service_url/" + shipmentId, successHandler);
    });
});

Изначально все поля, зависящие от режима, скрыты. Затем, когда вы выберете доставку, будет вызван обратный вызов change. Он отправляет запрос службе (действие контроллера), которая возвращает режим для данной отправки. И вы используете этот режим и показываете только те элементы div, у которых их data-shipment-mode имеет одинаковое значение.

Вы даже можете расширить это, и когда вы скрываете div, вы можете очистить значения всех входов (и выбрать и т. д.) внутри него, а также отключить их.

Вы можете избежать отправки запроса на сервер, если встроите режим для каждой отправки в ее тег опции:

Вид:

<option id="A_SHIPMENT_ID" 
        data-shipment-mode="SHIPMENT_MODE_FOR_THIS_SHIPMENT">
        Shipment A
</option>

JavaScript:

$(document).ready(function() {
    $('id-of-shipment-select-menu').change(function(e) {
        var mode = $(e.target).data("shipment-mode");
        $("div[data-shipment-mode!=" + mode + "]").hide();
        $("div[data-shipment-mode=" + mode + "]").show();
    });
});
person βξhrαng    schedule 09.01.2012