未捕获的类型错误:无法使用 Laravel 和 AJAX 读取未定义的属性“”

时间:2021-07-14 10:12:43

标签: javascript jquery ajax laravel

我有以下选择框:

 <select class="form-control select2-single" data-width="100%" name="numero_projet" id="numero_projet">
    <option label="&nbsp;">&nbsp;</option>
    @foreach($projets as $projet)
      <option data-id="{{$projet->id_projet}}" value="{{$projet->id_projet}}">{{$projet->numero_projet}}</option>
    @endforeach
   </select>

以及以下获取数据的ajax代码:

<script>
    $(document).ready(function(){


        $('#numero_projet').change(function(){

            var id_projet = $(this).find("option:selected").data("id");

            console.log(id_projet);

        $.ajaxSetup({

            headers: { 'X-CSRF-TOKEN': 
        $('meta[name="_token"]').attr('content') }

          });
        
        $.ajax({
                  
            url:"getProjet/"+id_projet,
            type:"GET",
             success:function(html){

            var content = html.content;
   
        $("div.name_casting").append(content.id_casting);
    
        }
            
    })
        })

        })
</script>

以及以下控制器:

 public function getProjet()

    {

    if(request()->ajax())
        {
           $id_projet = request('numero_projet');

          $projets_casting = Projet_Casting::where('id_projet',$id_projet)->get();

            return response()->json(['projets_casting' => $projets_casting]);
          
        }
    }

我有以下视图,我应该在其中显示从控制器获取的数据:

 <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title">Select from Library</h5>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                            <span aria-hidden="true">&times;</span>
                        </button>
                    </div>
                @foreach($projets_casting as $projet_casting)
                    <div class="modal-body scroll pt-0 pb-0 mt-4 mb-4">
                        <div class="accordion" id="accordion">
                            <div class="mb-2">
                                <button class="btn btn-link p-0 folder-button-collapse" data-toggle="collapse"
                                    data-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
                                    <span class="icon-container">
                                        <i class="simple-icon-arrow-down"></i>
                                    </span>
                                    <span class="folder-name">Castings</span>
                                </button>
                                <div id="collapseOne" class="collapse show" data-parent="#accordion">
                                    <div class="list disable-text-selection">
                                        <div class="row">
                                       
                                            <div class="col-6 mb-1 sfl-item-container casting"
                                                data-preview-path="img/products/chocolate-cake-thumb.jpg"
                                                data-path="img/products/chocolate-cake-thumb.jpg"
                                                data-label="chocolate-cake-thumb.jpg">
                                                <div class="card d-flex mb-2 p-0 media-thumb-container">
                                                    <div class="d-flex align-self-stretch">
                                                        <img src="img/products/chocolate-cake-thumb.jpg" alt="uploaded image"
                                                            class="list-media-thumbnail responsive border-0" />
                                                    </div>
                                                    <div class="d-flex flex-grow-1 min-width-zero">
                                                        <div
                                                            class="card-body pr-1 pt-2 pb-2 align-self-center d-flex min-width-zero">
                                                            <div class="w-100">
                                                                <p class="truncate mb-0">{{$projet_casting->id_casting}}</p>
                                                            </div>
                                                        </div>
                                                        <div
                                                            class="custom-control custom-checkbox pl-1 pr-1 align-self-center">
                                                            <label class="custom-control custom-checkbox mb-0">
                                                                <input type="checkbox" class="custom-control-input">
                                                                <span class="custom-control-label"></span>
                                                            </label>
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                         

                                            
                                        </div>
                                    </div>
                                </div>
                            </div>
                            
                        </div>
                    </div>
                 @endforeach    
                    <div class="modal-footer">
                        <button type="button" class="btn btn-outline-primary" data-dismiss="modal">Annuler</button>
                        <button type="button" class="btn btn-primary sfl-submit">Selectionner</button>
                    </div>
                </div>
            </div>

它应该在这个 div 中显示每个项目的 id_casting

<div class="w-100 name_casting">
 <p class="truncate mb-0">ok</p>
</div>

但我收到以下错误:

<块引用>

未捕获的类型错误:无法读取未定义的属性“id_casting”

我的代码有什么问题?

更新

我认为有以下 HTML:

 <div id="collapseOne" class="collapse show" data-parent="#accordion">
                                    <div class="list disable-text-selection">
                                        <div class="row">
                                       
                                            <div class="col-6 mb-1 sfl-item-container casting"
                                                data-preview-path="img/products/chocolate-cake-thumb.jpg"
                                                data-path="img/products/chocolate-cake-thumb.jpg"
                                                data-label="chocolate-cake-thumb.jpg">
                                                <div class="card d-flex mb-2 p-0 media-thumb-container casting2">
                                                    <div class="d-flex align-self-stretch">
                                                        <img src="img/products/chocolate-cake-thumb.jpg" alt="uploaded image"
                                                            class="list-media-thumbnail responsive border-0" />
                                                    </div>
                                                    <div class="d-flex flex-grow-1 min-width-zero">
                                                        <div
                                                            class="card-body pr-1 pt-2 pb-2 align-self-center d-flex min-width-zero">
                                                            <div class="w-100 castings">
                                                                <p class="truncate mb-0">OK</p>
                                                            </div>
                                                        </div>
                                                        <div
                                                            class="custom-control custom-checkbox pl-1 pr-1 align-self-center">
                                                            <label class="custom-control custom-checkbox mb-0">
                                                                <input type="checkbox" class="custom-control-input">
                                                                <span class="custom-control-label"></span>
                                                            </label>
                                                        </div>
                                                    </div>
                                                </div>
                                            </div>
                                         

                                            
                                        </div>
                                    </div>
                                </div>

我正在尝试以下脚本:

<script>
    $(document).ready(function(){


        $('#numero_projet').change(function(){

            var id_projet = $(this).find("option:selected").data("id");

            console.log(id_projet);

        $.ajaxSetup({

            headers: { 'X-CSRF-TOKEN': 
        $('meta[name="_token"]').attr('content') }

          });
        
        $.ajax({
                  
            url:"getProjet/"+id_projet,
            type:"GET",
             dataType:"json",
             success:function(json){
                     renderTemplate(json)
             }
    });

        function renderTemplate(json) {
        var content = ` <div">
                   <p class="truncate mb-0">${json.id_casting}</p>
                    </div>`;

    $("div.name_casting").append(content);
}
        })

        })

</script>

但是我什么都没有。我一直OK,我没有错误!

更新2

现在我可以获得我想要的数据,但是我同时获得了多行,所以我的 HTML 中应该有多个 div。

我得到以下结果:

enter image description here

虽然我应该在一个 div 中得到 18,而在其他 div 中得到 19,而不是在同一个地方。

1 个答案:

答案 0 :(得分:0)

类似于@professoranswer

  1. 使用 JSON (推荐)
    不必修改控制器
    在您的刀片/JavaScript 中,更改以下内容:
$.ajax({                  
    url:"getProjet/"+id_projet,
    type:"GET",
    dataType:"json",
    success:function(json){
        renderTemplate(json)
    }        
});

function renderTemplate(json) {
    var content = `<div>
        ${json.castings.map((casting) => casting.id_projet)}
    </div>`;

    $("div.name_casting").append(content);
}
  1. 使用 HTML
    刀片视图和 JavaScript
    在您的控制器中,更改以下内容:
public function getProjet()
{
    if(request()->ajax())
    {
        $id_projet = request('numero_projet');

        $projets_casting = Projet_Casting::where('id_projet',$id_projet)->get();

        return view('your-view', ['projets_casting' => $projets_casting]);          
    }
}