我的主要问题:
如果用户撰写评论并且 然后 决定加载更多评论,他将至少看到一个冗余评论。
因果关系:
通过Laravel Pagination,脚本通过Axios加载最后10个项目。添加一条评论并再次获取下一个10项后,"顺序"是一个元素的转移。因此,得到一个重复元素。
尝试修复它:
首先尝试: 我尝试使用Array.prototype.includes()或Lodash Includes:
data(){
return { items: [] };
}
...
addWithoutRedudancy(newItems){
for(let item of newItems){
if( ! _.includes( this.items, item ) ) this.items.push(item);
}
}
发生问题:
即使我看起来有两个相同的对象,如果我检查,我会在控制台中输入错误:
$vm0.items[10] == $vm0.items[11] //False even though objects look the same, and actually are (looking to all properties)
这是一个很大的问题,因为包裹无法找到冗余的对象!我不知道为什么这些对象的保存方式不同。也许是因为我在两个不同的时间上通过axios取了它们?
但是即使它可以工作,在用户写了8个新评论后,他只会从分页(控制器)中获得2条新评论,但当然应该得到接下来的10条评论。
第二次尝试
/**
* Fetch all relevant comments.
*
* @param string $username
* @param Selllink $selllink
*/
public function index($username, $selllink)
{
//Route::prefix('/{username}/{selllink}
//Sellink gets the model of sell and loads all comments to that sell.
//get me the latest first (we want to see the current comments)
//take only 10 coments with paginatation
return $selllink->sell->comments()
->latest()
->offset($addedCommentsNumber??) //that can't work...
->paginate(10);
}
发生问题: 我无法真正抵消整张桌子。我需要抵消分页的那些并再次添加缺失的那些。
结论
必须有一个更好的方法来做到这一点。但我不知道怎么做。
更多详情说明(如果需要):
我有 Vue评论组件,可以通过分页从我的 CommentController 获取数据:
methods: {
fetch(){
axios.get(this.url()).then(this.refresh);
},
url() {
this.page++;
return `${location.pathname}/comments?page=${this.page}`;
},
refresh({data}){
this.dataSet = data;
this.addWithoutRedudancy(data.data);
},
}
如果用户希望获得更多评论,则只需点击"加载更多"按钮,我正在加载评论
答案 0 :(得分:0)
我要感谢@James。我使用WHERE查询
保存所有提取的注释+的最后一个ID我将Vue方法更改为:
url() {
this.page++;
return `${location.pathname}/comments?page=${this.page}&lastComment=${this.idOfLastComment}`;
},
在我的控制器中:
/**
* Fetch all relevant comments.
*
* @param string $username
* @param Selllink $selllink
*/
public function index($username, $selllink)
{
$commentID = request('lastComment', $default = 0);
$filter = $commentID == 0 ? '>' : '<=';
return $selllink->sell->comments()
->where('id', $filter, $commentID)
->latest()
->paginate(10);
}
完美地工作:)