使用 Alpine Js / Javascript in Laravel 将 id+index 值分配给表单字段以进行操作
Assigning a id+index value to a form field for manipulation using Alpine Js / Javascript in Laravel
环境:
Laravel 9,
高山JS,
TailWinds CSS、原版 Js
我正在尝试在用户输入 " 到英寸或 ' 到 ft 时在表单字段中进行值替换。我已经在页面上实现了 'add another row' 功能,最终给我 具有相同id的多个字段.
我不知道如何突出显示特定代码行,所以我在下面的描述字段代码中添加了 (2 处)...
<!-- PO Lines Below -->
<!-- Row 1 Fields -->
<div class="row" x-data="handler()">
<div class="col">
<template x-for="(field, index) in fields" :key="index">
<div id="po_line" class="my-4">
Line: <strong x-text="index + 1"></strong>
<label for="qty">Qty: </label>
<input x-model="field.qty" type="number" class="form-control rounded-lg text-sm" name="qty[]" value="" style="width:90px" />
<label for="part_num" class="ml-3">Part #: </label>
<input x-model="field.part_num" type="text" class="form-control rounded-lg text-sm" name="part_num[]" value="" style="width:200px" />
<label for="descrip" class="ml-3">Descrip: </label>
<!-- HERE ----> <input x-model="field.descrip" type="text" class="form-control rounded-lg text-sm" name="descrip[]" value="" style="width:300px" id="descrip_id" onblur="replaceQuotes()" />
<label for="cost" class="ml-3">Cost: </label>
<input x-model="field.cost" type="number" class="form-control rounded-lg text-sm" name="cost[]" value="" style="width:110px" step="0.01" min = "0" />
<a href="#scroll" class="bg-red-600 hover:bg-red-500 text-white h-9 py-1 px-2 rounded-lg inline-flex items-center" @click="removeField(index)">
<i class="fa-solid fa-trash mx-1" style="font-size: 0.9rem;"></i>
</a>
</div>
<!-- Row 2 Fields -->
<div id="po_line" class="my-4">
Line: <strong x-text="index + 1"></strong>
<label for="qty">Qty: </label>
<input x-model="field.qty" type="number" class="form-control rounded-lg text-sm" name="qty[]" value="" style="width:90px" />
<label for="part_num" class="ml-3">Part #: </label>
<input x-model="field.part_num" type="text" class="form-control rounded-lg text-sm" name="part_num[]" value="" style="width:200px" />
<label for="descrip" class="ml-3">Descrip: </label>
<!-- HERE ----> <input x-model="field.descrip" type="text" class="form-control rounded-lg text-sm" name="descrip[]" value="" style="width:300px" id="descrip_id" onblur="replaceQuotes()" />
<label for="cost" class="ml-3">Cost: </label>
<input x-model="field.cost" type="number" class="form-control rounded-lg text-sm" name="cost[]" value="" style="width:110px" step="0.01" min = "0" />
<a href="#scroll" class="bg-red-600 hover:bg-red-500 text-white h-9 py-1 px-2 rounded-lg inline-flex items-center" @click="removeField(index)">
<i class="fa-solid fa-trash mx-1" style="font-size: 0.9rem;"></i>
</a>
</div>
有问题的代码行是这样的:
<label for="descrip" class="ml-3">Descrip: </label>
<input x-model="field.descrip" type="text" class="form-control rounded-lg text-sm" name="descrip[]" value="" style="width:300px" id="descrip_id" onblur="replaceQuotes()" />
这是 replaceQuotes() 的工作 javascript 代码 - 仅适用于第一个实例
<script>
<!-- Replace Quotes in Form -->
function replaceQuotes() {
var x = document.getElementById("descrip_id");
x.value = x.value.replace(/\"/g, " inch ")
x.value = x.value.replace(/\'/g, " ft ")
<!-- Add a row of fields -->
function handler() {
return {
fields: [],
addNewField() {
this.fields.push({
qty: '',
part_num: '',
descrip: '',
cost: ''
});
},
removeField(index) {
this.fields.splice(index, 1);
}
}
}
}
</script>
此代码使用 REGEX 匹配将 " 替换为 inch,将 ' 替换为 ft。
此代码在第一个 id='descrip_id' 上运行良好,它是 id='descrip_id' 的第一行或第一个实例。但是在任何后续行上都不会更改。
我尝试连接使用 Alpine JS x-text 的第 # 行的索引。
我也试过像 replaceQuotes(this.id) 这样在函数内部传递 this.id ,然后在函数内部添加一个 id 参数,但两者都不起作用。
所以问题是:
1) 如何将索引连接到 id='descrip_id' 以获得唯一的 id,例如 id='descrip_id_1' ?
我试过 id='descrip_id'. 和 id='descrip_id'+
我假设我只需要通过函数调用传递索引?
-或-
2) 如何将活动 ID 传递给函数并让它仅处理当前 descrip_id 字段中的数据?
也尝试过,replaceQuotes(this.id) 然后在 Javascript 函数 replaceQuotes(id) 和 replaceQuotes($id) 中将 x 分配给函数主体中的 id。
谢谢!
在 Alpine.js 属性中,您可以使用任何 JS(但不是 HTML 您尝试过的方式)。所以创建动态 id
属性的正确方法就是使用模板文字并将活动项的索引传递给 replaceQuotes
函数。
<input x-model="field.descrip"
type="text"
class="form-control rounded-lg text-sm"
name="descrip[]"
value=""
style="width:300px"
:id="`descrip_id${index}`"
@blur="replaceQuotes(index)" />
<script>
function replaceQuotes(id) {
var x = document.getElementById(`descrip_id${id}`)
x.value = x.value.replace(/\"/g, " inch ")
x.value = x.value.replace(/\'/g, " ft ")
}
</script>
环境: Laravel 9, 高山JS, TailWinds CSS、原版 Js
我正在尝试在用户输入 " 到英寸或 ' 到 ft 时在表单字段中进行值替换。我已经在页面上实现了 'add another row' 功能,最终给我 具有相同id的多个字段.
我不知道如何突出显示特定代码行,所以我在下面的描述字段代码中添加了 (2 处)...
<!-- PO Lines Below -->
<!-- Row 1 Fields -->
<div class="row" x-data="handler()">
<div class="col">
<template x-for="(field, index) in fields" :key="index">
<div id="po_line" class="my-4">
Line: <strong x-text="index + 1"></strong>
<label for="qty">Qty: </label>
<input x-model="field.qty" type="number" class="form-control rounded-lg text-sm" name="qty[]" value="" style="width:90px" />
<label for="part_num" class="ml-3">Part #: </label>
<input x-model="field.part_num" type="text" class="form-control rounded-lg text-sm" name="part_num[]" value="" style="width:200px" />
<label for="descrip" class="ml-3">Descrip: </label>
<!-- HERE ----> <input x-model="field.descrip" type="text" class="form-control rounded-lg text-sm" name="descrip[]" value="" style="width:300px" id="descrip_id" onblur="replaceQuotes()" />
<label for="cost" class="ml-3">Cost: </label>
<input x-model="field.cost" type="number" class="form-control rounded-lg text-sm" name="cost[]" value="" style="width:110px" step="0.01" min = "0" />
<a href="#scroll" class="bg-red-600 hover:bg-red-500 text-white h-9 py-1 px-2 rounded-lg inline-flex items-center" @click="removeField(index)">
<i class="fa-solid fa-trash mx-1" style="font-size: 0.9rem;"></i>
</a>
</div>
<!-- Row 2 Fields -->
<div id="po_line" class="my-4">
Line: <strong x-text="index + 1"></strong>
<label for="qty">Qty: </label>
<input x-model="field.qty" type="number" class="form-control rounded-lg text-sm" name="qty[]" value="" style="width:90px" />
<label for="part_num" class="ml-3">Part #: </label>
<input x-model="field.part_num" type="text" class="form-control rounded-lg text-sm" name="part_num[]" value="" style="width:200px" />
<label for="descrip" class="ml-3">Descrip: </label>
<!-- HERE ----> <input x-model="field.descrip" type="text" class="form-control rounded-lg text-sm" name="descrip[]" value="" style="width:300px" id="descrip_id" onblur="replaceQuotes()" />
<label for="cost" class="ml-3">Cost: </label>
<input x-model="field.cost" type="number" class="form-control rounded-lg text-sm" name="cost[]" value="" style="width:110px" step="0.01" min = "0" />
<a href="#scroll" class="bg-red-600 hover:bg-red-500 text-white h-9 py-1 px-2 rounded-lg inline-flex items-center" @click="removeField(index)">
<i class="fa-solid fa-trash mx-1" style="font-size: 0.9rem;"></i>
</a>
</div>
有问题的代码行是这样的:
<label for="descrip" class="ml-3">Descrip: </label>
<input x-model="field.descrip" type="text" class="form-control rounded-lg text-sm" name="descrip[]" value="" style="width:300px" id="descrip_id" onblur="replaceQuotes()" />
这是 replaceQuotes() 的工作 javascript 代码 - 仅适用于第一个实例
<script>
<!-- Replace Quotes in Form -->
function replaceQuotes() {
var x = document.getElementById("descrip_id");
x.value = x.value.replace(/\"/g, " inch ")
x.value = x.value.replace(/\'/g, " ft ")
<!-- Add a row of fields -->
function handler() {
return {
fields: [],
addNewField() {
this.fields.push({
qty: '',
part_num: '',
descrip: '',
cost: ''
});
},
removeField(index) {
this.fields.splice(index, 1);
}
}
}
}
</script>
此代码使用 REGEX 匹配将 " 替换为 inch,将 ' 替换为 ft。
此代码在第一个 id='descrip_id' 上运行良好,它是 id='descrip_id' 的第一行或第一个实例。但是在任何后续行上都不会更改。
我尝试连接使用 Alpine JS x-text 的第 # 行的索引。
我也试过像 replaceQuotes(this.id) 这样在函数内部传递 this.id ,然后在函数内部添加一个 id 参数,但两者都不起作用。
所以问题是:
1) 如何将索引连接到 id='descrip_id' 以获得唯一的 id,例如 id='descrip_id_1' ?
我试过 id='descrip_id'.
我假设我只需要通过函数调用传递索引?
-或-
2) 如何将活动 ID 传递给函数并让它仅处理当前 descrip_id 字段中的数据?
也尝试过,replaceQuotes(this.id) 然后在 Javascript 函数 replaceQuotes(id) 和 replaceQuotes($id) 中将 x 分配给函数主体中的 id。
谢谢!
在 Alpine.js 属性中,您可以使用任何 JS(但不是 HTML 您尝试过的方式)。所以创建动态 id
属性的正确方法就是使用模板文字并将活动项的索引传递给 replaceQuotes
函数。
<input x-model="field.descrip"
type="text"
class="form-control rounded-lg text-sm"
name="descrip[]"
value=""
style="width:300px"
:id="`descrip_id${index}`"
@blur="replaceQuotes(index)" />
<script>
function replaceQuotes(id) {
var x = document.getElementById(`descrip_id${id}`)
x.value = x.value.replace(/\"/g, " inch ")
x.value = x.value.replace(/\'/g, " ft ")
}
</script>