【问题标题】:without select category not show subcategory没有选择类别不显示子类别
【发布时间】:2019-06-20 11:20:57
【问题描述】:

这是 create.blade.php 文件。在这也包括 css 和 js 文件.. html代码和ajax代码查看文件

@extends('layouts.app')

@section('content')
 <link rel="stylesheet" href="http://www.codermen.com/css/bootstrap.min.css">    
 <script src="http://www.codermen.com/js/jquery.js"></script>
<form enctype="multipart/form-data" method="post" action="{{route('post.store')}}" >
       @csrf
       <div class="form-group col-md-8">
                    Category<select name="category" id="category" class="form-control">
                                    <option>select</option>
                        @foreach($categories as $category)
                <option value="{{$category->id}}">{{$category->category}}</option>
                @endforeach
                            </select>
       </div>
       <div class="form-group col-md-8">
                    Category<select name="subcategory" id="subcategory" class="form-control">
                                    <option>select</option>
                        @foreach($subcategories as $subcategory)
                <option value="{{$subcategory->id}}">{{$subcategory->subcategory}}</option>
                @endforeach
                            </select>
       </div>
</form>

@endsection


 

这是创建类别和子类别的功能代码的控制器代码

public function create(Request $request){
    $categories = Category::all();
    $subcategories = DB::table('subcategories')
                        ->where('category_id', $request->category_id)
                        ->pluck('subcategory', 'id');
  return view('post.create', compact('categories', 'subcategories'));
}

这是路线

Route::get('/post/create', 'PostController@create')->name('post.create');

问题是如果我选择类别仍然没有显示与子类别相关的内容

【问题讨论】:

  • 你能在console.log(res)之后if(res){
  • 我做到了,但没有工作-@SarojShrestha
  • 执行console.log(res) 并显示它返回的内容。您可以通过点击ctrl+shift+i 并选择控制台选项卡来检查 res 中返回的内容
  • 发生此错误 Uncaught SyntaxError: Unexpected token 。 -@SarojShrestha
  • 我将 console.log 放入我的代码中,而不是显示此错误 create:1 [Violation] 向阻止滚动的“鼠标滚轮”事件添加了非被动事件侦听器。考虑将事件处理程序标记为“被动”以使页面更具响应性。见chromestatus.com/feature/5745543795965952 -@SarojShrestha

标签: laravel laravel-5 laravel-4 eloquent laravel-5.2


【解决方案1】:

您犯了一个愚蠢的错误,您正在将更改类别选择下拉列表的 ajax 请求发送到您的 create 函数,而您的 create 函数正在渲染视图 post.create 而不是返回 json 响应到 ajax 请求。

所以现在你能做什么? 2 个选项可供您选择:

选项 1:创建名为“get_subcategory_by_category_id”的其他函数,它将返回 json 中的子类别,同时在 routes/web.php 中创建新路由。

选项 2:laravel 提供 $request-&gt;ajax() 来检测请求是否为 ajax?所以使用它并在 json 中返回响应,这样你就会得到响应。

public function create(Request $request){
    $categories = Category::all();
    $subcategories = DB::table('subcategories')
                        ->where('category_id', $request->category_id)
                        ->pluck('subcategory', 'id');

    if($request->ajax()){
        $response=array('categories'=>$categories,'subcategories'=>$subcategories);
        return response()->json($response,200);
    }
    return view('post.create', compact('categories', 'subcategories'));
}

您的 ajax 函数应如下所示:

<script type="text/javascript">
    $(document).on('change','#category',function(){
    var categoryID = $(this).val();    
    if(categoryID){
        $.ajax({
           type:"GET",
           url:"{{url('create')}}?category_id="+categoryID,
           dataType:'json',
           success:function(res){               
            if(res){
                console.log(res);
                // forloop through subcategory and append 
            }else{
               $("#subcategory").empty();
            }
           }
        });
    }else{
        $("#subcategory").empty();

    }      
   });
</script>

确保您的请求 url 正确,同时检查 Inspect Element > Network 选项卡以获取 ajax 请求响应。

【讨论】:

  • 我应用了您的代码,但在元素 > 网络选项卡中没有显示任何内容
  • 表示您的 ajax url 不正确,您的 ajax 请求不起作用
  • 试试url:"{{route('post.create')}}?category_id="+categoryID
  • 或尝试简单的url:"/post/create?category_id="+categoryID
  • @kinnariprajapati,请检查更新的脚本标签,您忘记在文档中添加您的功能
【解决方案2】:

jquery 附加代码看起来是正确的。我认为问题可能出在您的路由上。

你有

url:"{{url('create')}}?category_id="+categoryID,

作为通过 Laravel 方法 url() 调用的 GET 请求。如果您在这里使用url() 可能会有所帮助,就像您在 web.php 中设置路由一样,这将使用完整的 url 路径:

url:"{{url('post/create/')}}"+categoryID,

这让 url() 函数添加参数。但是,如果它是一个 GET 请求(并将 $category_id 添加到控制器方法),它也可能有助于考虑路由文件中的传入参数:

Route::get('post/create/{id}', 'PostController@create')

我可能会创建一个单独的函数来获取子类别 - 然后让您的 ajax 调用该函数并拉取子类别。干净一点。

但我认为您的问题可能出在路由上,也许上面的一些内容会对您有所帮助。

【讨论】:

  • 是的,您需要在到 ajax 的路线上匹配它(不要只是完全复制我所拥有的),但我认为如果您可以调整它以使页面通过,也许分开以获得子类别,这可能会解决您的问题。我认为“创建”网址可能已经发生冲突或没有去正确的地方。只是猜测-我不知道您的路线文件中还有什么。
  • 我仍然认为这是您的路由问题。如果您不想通过 url() 进行更改,可以尝试使用 route() 方法,例如: -----> url: "{{route('post.create', ['category_id' => $ category->id])}}" 我不确定通过 ajax 的效果如何,但 route() 可以与命名路由一起使用。
  • 不要忘记在 web.php 中的 Route::get() 方法中允许参数 (id) -- 否则会出现找不到页面。
  • 如果您能提供 what 不起作用会更有帮助。创建一个正确的路由,将获取子类别的函数分离到它自己的函数中,然后返回一个 JSON 值工作 - 您只需将正确的数据放入 res。
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多