我已经绞尽脑汁2天了,来来回回寻找这个问题的解决方案,请给我一个启发:
我有这个JavaScript代码,包括一个刀片文件,并通过它传递数据。
const loadTemplate = (locationinfo) => {
let info = `
<div class="location-info">
<h1>${locationinfo.business_name}</h1>
@include('pages/business-space/templates/t1',[
'locationinfo'=>'${JSON.stringify(locationinfo)}', //this is the code
])
</div>`;
return info;
}
当我在控制台记录JSON.stringify(locationinfo)
时,它只是一个普通的json字符串:
{
"id":3,
"business_name":"Wen",
"business_address":"sdfsdf",
"lat":14.764397881407836,
"lng":121.08031105807841,
"is_active":"Yes",
"created_by":null,
"date_created":"2022-06-17 11:09:42"
}
在我的t1.blade.php中如果我回显locationinfo变量它仍然显示相同的:
echo $locationinfo;
//and the result:
{
"id":3,
"business_name":"Wen",
"business_address":"sdfsdf",
"lat":14.764397881407836,
"lng":121.08031105807841,
"is_active":"Yes",
"created_by":null,
"date_created":"2022-06-17 11:09:42"
}
但是当我试图用json_decode
解码它时,它变成了null。下面是我的代码:
$arr = json_decode($locationinfo); //this is null
foreach ($arr as $key => $value) {
echo $key;
}
另一个错误:
$arr = json_decode($locationinfo, true);
foreach ($arr as $key => $value) {
echo $key;
}
//error: foreach() argument must be of type array|object, null given
为什么会发生这种情况?提前谢谢。
首先确保$locationinfo
是一个json字符串。我怀疑这是一个php关联数组
试试echo $locationinfo['id'];
。如果value出现,u不想解码它。使用$locationinfo
直接不带json解码
如果是json,试着这样使用,
$arr = json_decode($locationinfo, true);
添加一个strip斜杠。
$data = json_decode(stripslashes($data),true);
Demo: http://codepad.org/XX9QD3iX
回答在这里:https://stackoverflow.com/a/37599821/19168006
编辑:示例中有stdClass错误,这是工作的一个:http://codepad.org/lfJJu5yA
你不能把js的数据传递给PHP,因为PHP会先渲染。
但您可以调用ajax并返回blade响应
你的ajax调用
const loadTemplate = (locationinfo) => {
$.ajax({
data: {
'locationinfo': locationinfo,
},
type: "post",
url: "{{route('someRoute')}}",
success: function (data) {
let info = `
<div class="location-info">
<h1>${locationinfo.business_name}</h1>
${data}
</div>`;
return info;
},
error: function () {
//has error
}
});
}
你的路线
Route::get('/getAjaxData', [AjaxController::class,'show']) ->name('someRoute'); // but i use __invoke controller
控制器
<?php
namespace YOUR_NAMESPACE;
use AppHttpControllersController;
use IlluminateHttpRequest;
class AjaxController extends Controller
{
public function show(Request $request)
{
$data = $request->input('locationinfo');
return view('pages/business-space/templates/t1')->with([
'locationinfo' => $data,
]);
}
}