You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过jQuery Ajax在Blade中正确渲染Admin权限条件按钮?

问题分析与解决方案

你遇到的核心问题是把服务器端的Blade模板语法直接混在了客户端执行的JavaScript代码里——Blade的@if是在服务器解析视图的时候执行的,而你的JS代码是浏览器拿到页面后才运行的,浏览器根本不认识@if这种语法,自然会抛出语法错误。

下面给你几种可行的解决思路:

思路1:提前在Blade中定义权限标识变量

先在Blade视图里,把用户是否为admin的判断结果存在一个JS变量里,之后在JS代码里用这个变量做条件判断:

{{-- 在Blade的<script>标签里先定义权限变量 --}}
<script>
// 服务器端解析后,这里会直接变成true或false
const isAdmin = {{ Auth::check() && Auth::user()->rol === 'admin' ? 'true' : 'false' }};

// 你的原有JS逻辑
function tuFuncion() {
    let codigo = '';
    for(let i = 0; i < puntos.length; i++) {
        codigo += '<tr>...<td class=""><input name="incertidumbre['+i+']" class="pl-2 font-weight-bolder sinbordeimpar" value="'+puntos[i].incertidumbre+'" disabled></td>';
        
        // 用之前定义的isAdmin变量做判断
        if(isAdmin) {
            // 注意这里修复了name/id的引号拼接错误
            codigo += '<td><input class="btn btn-sm btn-outline-secondary" type="button" value="Editar" name="btnedit_Punto'+puntos[i].id+'" id="btnEditar_Punto'+puntos[i].id+'">';
            codigo += '<input hidden="hidden" class="btn btn-sm btn-outline-secondary" type="button" value="Guardar" name="btnGuardar_Punto'+puntos[i].id+'" id="btnGuardar_Punto'+puntos[i].id+'"></td>';
        }
        
        codigo += '</tr>';
    }
    $('#prueba').html(codigo);
}
</script>

思路2:在Blade中预渲染按钮模板

如果你想让服务器端直接生成按钮的HTML片段,可以在Blade里提前把模板字符串渲染好,然后在JS里复用:

{{-- 在Blade里预渲染admin按钮的模板(用模板字符串占位符) --}}
<script>
const adminButtonsTemplate = `{!! Auth::check() && Auth::user()->rol === 'admin' ? '<td><input class="btn btn-sm btn-outline-secondary" type="button" value="Editar" name="btnedit_Punto\${puntoId}" id="btnEditar_Punto\${puntoId}"><input hidden="hidden" class="btn btn-sm btn-outline-secondary" type="button" value="Guardar" name="btnGuardar_Punto\${puntoId}" id="btnGuardar_Punto\${puntoId}"></td>' : '' !!}`;

function tuFuncion() {
    let codigo = '';
    for(let i = 0; i < puntos.length; i++) {
        codigo += '<tr>...<td class=""><input name="incertidumbre['+i+']" class="pl-2 font-weight-bolder sinbordeimpar" value="'+puntos[i].incertidumbre+'" disabled></td>';
        
        // 替换模板里的占位符,拼接到codigo中
        if(adminButtonsTemplate) {
            const buttons = adminButtonsTemplate.replace(/\${puntoId}/g, puntos[i].id);
            codigo += buttons;
        }
        
        codigo += '</tr>';
    }
    $('#prueba').html(codigo);
}
</script>

额外注意点

你原来的JS代码里还有一个小问题:name="btnedit_Punto"'+puntos[i].id+'"这种写法会导致HTML属性的引号不闭合,比如最终会变成name="btnedit_Punto"123",这是无效的HTML。上面的解决方案里已经修复了这个问题,改成了name="btnedit_Punto'+puntos[i].id+'",确保引号正确包裹属性值。

内容的提问来源于stack exchange,提问作者Oscar_co

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:43:14