2014-12-30 2 views
0

Есть ли способ проверить напрямую, если содержимое поля формы в каркасе воспроизведения изменилось?проверить, изменилось ли поле формы с помощью объекта формы формы

, например, мой Device.java что-то вроде этого:

class Device{ 
    String name; 
    String type;} 

, а затем где-то в мой контроллер, у меня есть форма типа устройства. есть ли способ проверить с помощью boundForm, если значение свойства name изменилось?

public class Devices extends Controller { 

private static final Form<Device> deviceForm = Form.form(Device.class); 

public static Result details(Device device) { 
    if (device == null) { 
     return notFound(String.format("Device does not exist. ")); 
    } 
    Form<Device> filledForm = deviceForm.fill(device); 
    return ok(views.html.devices.details.render(filledForm)); 
} 


public static Result save() { 
    Form<Device> boundForm = deviceForm.bindFromRequest(); 
    ... 
    [here] 
    ... 
} 
} 

Примечание: детали метод покажет пользователю заполненную форму, пользователь может или не может изменить значения, а затем, нажав на кнопку Сохранить, метод сохранения() будет вызван.

+0

И для чего? Проверить, существует ли существующее устройство? Затем вы также можете использовать запрос AJAX. – Tom

+0

Нет простого решения для этого, есть некоторые возможности, но они зависят от того, что де-факто вам нужно для выполнения этой проверки. – biesior

+0

Я не очень хорошо знаком с AJAX, поэтому попытался найти другие решения. наконец, я придумал более сложное решение без использования объекта Form. Так что на данный момент у меня есть то, что я искал. спасибо за комментарии но было бы здорово, если бы я мог просто сказать что-то вроде: boolean nameChanged = boundForm.hasChanged ("name"); – behzad

ответ

1

В кратчайшие словами Form<T> не в состоянии проверить, если поля изменяются это просто без гражданства между просьбой и проверить его вам просто нужно, чтобы получить запись из БД и сравнить поле, на поле.

Кроме того, вы не должны полагаться на стороне клиента проверки, как это в основном для косметической, а не для безопасности. Помните, что с обычными инструментами webdev его можно легко манипулировать или пропустить.

Наконец, вы не должны уйти от Form возможности проверки, так как это очень удобный инструмент, вместо этого вы можете взаимодействовать с ним, то это может быть что-то вроде:

public static Result save() { 
    Form<Device> boundForm = deviceForm.bindFromRequest(); 
    if (boundForm.hasErrors()){ 
     return badRequest(devices.details.render(boundForm)); 
    } 

    Device boundDevice = boundForm.get(); 
    Device existingDevice = Device.find.byId(boundDevice.id); 

    if (boundDevice.name.equals(existingDevice.name)){ 
     boundForm.reject("Contents are identical"); 
     return badRequest(devices.details.render(boundForm)); 
    } 

    // else... form hasn't errors, name changed - should be updated... 
    boundDevice.update(boundDevice.id); 
} 

Таким образом, вы можете отобразить его на ваш взгляд то есть:

@if(yourForm.error("identicalContent")!=null) { 
    <div class="alert alert-danger">@yourForm.error("identicalContent").message</div> 
} 

Как вы можете видеть из этого образца - если вы хотите, чтобы пропустить UPDATE запрос, если нет изменений - не экономить ресурсы - это не имеет смысла, так как вам нужно сделать SELECT запрос в любом случае со mpare. В других случаях (например, добавление ТОЛЬКО в другом случае, если изменение) выше фрагмента является правильным решением.

+0

Спасибо @biesior за ваш ответ, моя модель (устройство) немного сложнее, чем то, что я написал в вопросе. как вы упомянули, я делаю много проверок внутри моего контроллера, чтобы убедиться, что данные приемлемы. (Я думаю, мне нужно перепроектировать ключевые атрибуты моей модели, чтобы сделать все лучше.) Кстати, вы упомянули, что проверка на стороне клиента небезопасна, что именно вы имеете в виду с проверкой на стороне клиента? Ajax? – behzad

+1

Да, в общем я имею в виду AJAX – biesior

+2

P.S. Я согласен с @Tom, что создание приложений AJAX с Play довольно неплохое и эффективное, то есть есть хорошие видеоролики Play + Angular, во всяком случае, никогда не будет так хорошо, как JS framework - даже если у вас отличные валидаторы, окончательная проверка должна быть выполнена в вашем серверный контроллер. – biesior

Смежные вопросы