我有一个表单的一部分,它根据用户在控件中的选择动态加载不同的字段集。我使用javascript事件处理程序来检测选择何时更改,并使用AJAX(使用HTML有效负载)来提取适当的字段集。
我希望能够使用Laravel的Form::getValueAttribute()
方法自动填写表单字段'静态和动态表单部分中的值。但是,我的AJAX调用加载的局部视图与我的主窗体的视图没有相同的Form类实例,所以我不能在部分中调用getValueAttribute()
。
我的想法是让AJAX调用POST,并序列化必要的数据(Input::old()
的子集或模型数据,具体取决于页面是否因验证错误而加载,或者是UPDATE请求)与POST一起发送,以便我得到的HTML片段正确设置值。
这是获得我想要的最佳方式吗?如果是这样,Laravel是否有任何工具可以帮助进行表单数据的序列化?如果没有,那可能是更好的方法呢?
答案 0 :(得分:0)
我找到了一种我更喜欢的方法。正常加载视图时,我像往常一样使用AJAX加载部分。但是当加载视图进行后期验证或编辑时,我使用Laravel的Views的嵌套方法将包含正确字段的局部视图直接嵌套到响应中。然后,partial可以访问我需要的所有输入和错误数据。用户仍然可以像往常一样更改字段集,但如果他们已经在之前选择的字段集中设置了一些值,我会为他们设置确认提示。如果他们决定继续进行,则清除字段集并像往常一样通过AJAX引入新的字段集。
我的代码看起来像这样:
控制器:
public function newThing() {
if ( Request::session()->has('errors') ) {
// this is a validation post-back
return View::make('thing')
->nest('fields', 'fields_partial');
} else {
// just a normal unfilled form
return View::make('thing');
}
}
public function editThing() {
return View::make('thing')
->nest('fields', 'fields_partial');
}
查看:thing.blade.php
(只是它的一部分)
...
<form>
...
<select id="picker">...</select>
<div class="sub-fields">
{{ isset($fields) ? $fields : '' }}
</div>
...
</form>
...
<script>
$('#picker').change(function() {
// if any .sub-fields inputs have been changed, get confirmation from the user
// if user confirms, do ajax stuff to replace .sub-fields contents with new field set
// otherwise cancel the change
});
</script>