Laravel PJAX 的路由行为不符合预期
Laravel routing behavior with PJAX not as expected
我正在从头开始构建我的第一个 lavavel 网站,我 运行 遇到了一些路由的行为问题。
这是我的路由文件的相关代码:
Route::get('work', 'PageController@work');
Route::get('work/{item}', 'PageController@workitem');
相关方法如下:
public function work() {
return view('pages.work');
}
public function workitem($item) {
$v = 'work.'.$item;
if(view()->exists($v)) {
return view($v);
} else {
return view('errors.noitem');
}
}
这里是我观点的相关部分:
@extends('layout')
@section('content')
...
<div class="workflex">
<a class="workitem" href="/work/test"></a>
<a class="workitem" href="/work/test2"></a>
</div>
<div id="loadContent" class="loadContent">
@yield('insert')
</div>
...
@stop
值得一提的是,我打算用 PJAX 加载 individual workitem 页面。我认为 PJAX 基于 URL:
加载到 "insert" 部分
$(document).pjax('a.workitem', '#loadContent');
用户在 /work 子目录加载初始工作页面,然后单击一个按钮以使用 PJAX 加载 /work/item 页面。正如路由所建议的那样,我还希望用户能够将工作项输入 URL 并被定向到已加载该项目的工作页面。整个系统按预期运行......直到我将以下 jquery 添加到 work.blade.php:
$(document).ready(function() {
$('#loadContent').load("/work/init", function() {
myFade('#loadContent > *', 1); //ignore this function, it's an animation irrelevant to my problem
});
});
这里是尝试在 PJAX loading div #loadContent 中加载初始消息,告诉用户 select 一个工作项。但是,这样做的一个副作用是,现在每当我直接浏览到 /work/item(PJAX 仍然正确加载页面)时,文档都会触发此 jquery 并且消息会覆盖页面内容。
我正在集思广益,让我的控制器中的 work() 方法触发加载此脚本或仅将 work/init 视图传递到 "insert" 部分的内容。
您认为解决此问题的最佳方法是什么?非常感谢您的回答。
我能够回答我自己的问题。我忘记了路由可选参数。我changed/added这些东西:
Route::get('work/{item?}', 'PageController@work');
在我的控制器中:
public function work($item = 'init') {
$v = 'work.'.$item;
if(view()->exists($v)) {
return view($v);
} else {
return view('errors.noitem');
}
}
现在完美运行!
我正在从头开始构建我的第一个 lavavel 网站,我 运行 遇到了一些路由的行为问题。
这是我的路由文件的相关代码:
Route::get('work', 'PageController@work');
Route::get('work/{item}', 'PageController@workitem');
相关方法如下:
public function work() {
return view('pages.work');
}
public function workitem($item) {
$v = 'work.'.$item;
if(view()->exists($v)) {
return view($v);
} else {
return view('errors.noitem');
}
}
这里是我观点的相关部分:
@extends('layout')
@section('content')
...
<div class="workflex">
<a class="workitem" href="/work/test"></a>
<a class="workitem" href="/work/test2"></a>
</div>
<div id="loadContent" class="loadContent">
@yield('insert')
</div>
...
@stop
值得一提的是,我打算用 PJAX 加载 individual workitem 页面。我认为 PJAX 基于 URL:
加载到 "insert" 部分$(document).pjax('a.workitem', '#loadContent');
用户在 /work 子目录加载初始工作页面,然后单击一个按钮以使用 PJAX 加载 /work/item 页面。正如路由所建议的那样,我还希望用户能够将工作项输入 URL 并被定向到已加载该项目的工作页面。整个系统按预期运行......直到我将以下 jquery 添加到 work.blade.php:
$(document).ready(function() {
$('#loadContent').load("/work/init", function() {
myFade('#loadContent > *', 1); //ignore this function, it's an animation irrelevant to my problem
});
});
这里是尝试在 PJAX loading div #loadContent 中加载初始消息,告诉用户 select 一个工作项。但是,这样做的一个副作用是,现在每当我直接浏览到 /work/item(PJAX 仍然正确加载页面)时,文档都会触发此 jquery 并且消息会覆盖页面内容。
我正在集思广益,让我的控制器中的 work() 方法触发加载此脚本或仅将 work/init 视图传递到 "insert" 部分的内容。
您认为解决此问题的最佳方法是什么?非常感谢您的回答。
我能够回答我自己的问题。我忘记了路由可选参数。我changed/added这些东西:
Route::get('work/{item?}', 'PageController@work');
在我的控制器中:
public function work($item = 'init') {
$v = 'work.'.$item;
if(view()->exists($v)) {
return view($v);
} else {
return view('errors.noitem');
}
}
现在完美运行!