在来自 jquery 的动态创建的内容上绑定 Vue 点击功能
Bind Vue click function on dynamically created content from jquery
首先,我是 vuejs 的新手,目前正在开发一个使用 Laravel 制作的项目。我会在我觉得需要它的地方使用 Vue。在某个页面上,我正在使用数据表加载机器请求列表
$list = LicenceRequests::orderBy('allocated')->with('users.userDetails')->where('users_id', '!=', 1)->get();
return Datatables::of($list)
->addColumn('actions', function ($list) {
return '<button data-id="'.$list->id.'" class="btn btn-success" @click="allocateEvent">Allocate</button>';
})
->addIndexColumn()
->rawColumns(['actions'])
->make(true);
我添加了一个点击功能,以便在渲染数据表时,可以调用一个Vue函数。在 blade 模板中,我使用以下 html 代码:
<div id="content" class="content">
<div class="block">
<div class="block-content">
<table class="table table-bordered table-striped " id="requestList">
<thead>
<tr>
<th>Sr. No</th>
<th class="hidden-xs" >Name</th>
<th class="hidden-xs" >Email</th>
<th class="hidden-xs" >Requests</th>
<th class="hidden-xs" >Allocated</th>
<th class="hidden-xs" >Date requested</th>
<th class="hidden-xs" >Machine address</th>
<th class="text-center">Actions</th>
</tr>
</thead>
</table>
</div>
</div>
</div>?
对于数据表,我在页面加载函数中调用它如下:
$(function (){
$('#requestList').dataTable({
processing: false,
serverSide: true,
ajax: '{!! route('admin.getLicenceRequests') !!}',
columns: [
{data: 'DT_Row_Index', orderable: false, searchable: false},
{ data: 'users.user_details.name', name: 'name' },
{ data: 'users.email', name: 'email' },
{ data: 'number', name: 'number' },
{ data: 'allocated', name: 'allocated' },
{ data: 'request_generated_on', name: 'request_generated_on' },
{ data: 'machine_address', name: 'machine_address' },
{ data: 'actions', name: 'actions',orderable: false, searchable: false }
],
lengthMenu: [[ 10, 15, 20], [ 10, 15, 20]]
});
});
我正在同一页面上初始化 Vue
var vm = new Vue({
el: '#content',
methods: {
allocateEvent: function() {
console.log("hello");
}
}
})
问题是当我按下数据表呈现的 html 上的按钮时,该函数没有被调用。如果我将该函数绑定到页面上的任何其他元素,它将起作用。有没有我遗漏的东西或我没有添加的一些 Vue 相关代码?
P.S 我知道这不是 Vue 与 laravel blade 一起使用的方式。我只是想知道为什么上面的代码在应该的时候不起作用。
谢谢
我认为您不能像这样使用动态呈现的内容创建绑定。问题是首先创建 vue 应用程序,然后呈现具有 @click
绑定的内容。
以下是 Evan Yu 关于动态内容的评论:
https://forum-archive.vuejs.org/topic/151/vue-js-not-listening-to-dynamically-created-elements
建议在处理动态内容时使用 $compile(html)
和 appendChild
。
首先,我是 vuejs 的新手,目前正在开发一个使用 Laravel 制作的项目。我会在我觉得需要它的地方使用 Vue。在某个页面上,我正在使用数据表加载机器请求列表
$list = LicenceRequests::orderBy('allocated')->with('users.userDetails')->where('users_id', '!=', 1)->get();
return Datatables::of($list)
->addColumn('actions', function ($list) {
return '<button data-id="'.$list->id.'" class="btn btn-success" @click="allocateEvent">Allocate</button>';
})
->addIndexColumn()
->rawColumns(['actions'])
->make(true);
我添加了一个点击功能,以便在渲染数据表时,可以调用一个Vue函数。在 blade 模板中,我使用以下 html 代码:
<div id="content" class="content">
<div class="block">
<div class="block-content">
<table class="table table-bordered table-striped " id="requestList">
<thead>
<tr>
<th>Sr. No</th>
<th class="hidden-xs" >Name</th>
<th class="hidden-xs" >Email</th>
<th class="hidden-xs" >Requests</th>
<th class="hidden-xs" >Allocated</th>
<th class="hidden-xs" >Date requested</th>
<th class="hidden-xs" >Machine address</th>
<th class="text-center">Actions</th>
</tr>
</thead>
</table>
</div>
</div>
</div>?
对于数据表,我在页面加载函数中调用它如下:
$(function (){
$('#requestList').dataTable({
processing: false,
serverSide: true,
ajax: '{!! route('admin.getLicenceRequests') !!}',
columns: [
{data: 'DT_Row_Index', orderable: false, searchable: false},
{ data: 'users.user_details.name', name: 'name' },
{ data: 'users.email', name: 'email' },
{ data: 'number', name: 'number' },
{ data: 'allocated', name: 'allocated' },
{ data: 'request_generated_on', name: 'request_generated_on' },
{ data: 'machine_address', name: 'machine_address' },
{ data: 'actions', name: 'actions',orderable: false, searchable: false }
],
lengthMenu: [[ 10, 15, 20], [ 10, 15, 20]]
});
});
我正在同一页面上初始化 Vue
var vm = new Vue({
el: '#content',
methods: {
allocateEvent: function() {
console.log("hello");
}
}
})
问题是当我按下数据表呈现的 html 上的按钮时,该函数没有被调用。如果我将该函数绑定到页面上的任何其他元素,它将起作用。有没有我遗漏的东西或我没有添加的一些 Vue 相关代码?
P.S 我知道这不是 Vue 与 laravel blade 一起使用的方式。我只是想知道为什么上面的代码在应该的时候不起作用。 谢谢
我认为您不能像这样使用动态呈现的内容创建绑定。问题是首先创建 vue 应用程序,然后呈现具有 @click
绑定的内容。
以下是 Evan Yu 关于动态内容的评论:
https://forum-archive.vuejs.org/topic/151/vue-js-not-listening-to-dynamically-created-elements
建议在处理动态内容时使用 $compile(html)
和 appendChild
。