我正在尝试使用historyPush
状态更改我的网址,但我想在控制器操作结束后发生这种情况。我从文档中了解了afterAction
方法。但是我应该在哪里放置这种方法?它是在我的行动所在的同一个控制器中吗?我的js函数在select
元素onchange
上触发,如下所示:
<div class="col-sm-2 col-xs-3 sort-col hide-mobile">
<select class="product-select" onchange="pjaxFilterForm(); reCreateUrl(this);" name="sort_price">
<option value="" class="product-option" selected><?= Yii::t('app', 'app.sortprice')?></option>
<option value="ASC" class="product-option"<?= ((isset($_GET['sort_price']) and $_GET['sort_price'] == 'ASC')) ? ' selected' : ''; ?>><?= Yii::t('app', 'app.orderPriceAsc');?></option>
<option value="DESC" class="product-option"<?= ((isset($_GET['sort_price']) and $_GET['sort_price'] == 'DESC')) ? ' selected' : ''; ?>><?= Yii::t('app', 'app.orderPriceDesc');?></option>
</select>
</div>
<div class="col-sm-2 col-xs-3 sort-col hide-mobile">
<select class="product-select" onchange="pjaxFilterForm(); reCreateUrl(this);" name="sort_name">
<option value="" class="product-option" selected><?= Yii::t('app', 'app.sortname')?></option>
<option value="ASC" class="product-option"<?= ((isset($_GET['sort_name']) and $_GET['sort_name'] == 'ASC')) ? ' selected' : ''; ?>><?= Yii::t('app', 'app.orderNameAsc');?></option>
<option value="DESC" class="product-option"<?= ((isset($_GET['sort_name']) and $_GET['sort_name'] == 'DESC')) ? ' selected' : ''; ?>><?= Yii::t('app', 'app.orderNameDesc');?></option>
</select>
</div>
因此该函数在onchage
事件上触发,但我想暂停它直到控制器操作结束。 (现在该功能在动作之前执行)
整个想法是我有很少的过滤器,但是当我更改sort_name
过滤器后,我尝试更改sort_price
过滤器,第二个不起作用。所以,如果我的网址是?sort_price=&producer=&sort_name=DESC&view=1
,那么当我的js运行时,我的网址会像?sort_price=ASC&producer=&sort_name=&view=1
那样,这就是我想要达到的但是在控制器操作之后。
我的js:
function reCreateUrl(e) {
var elemName = e.name;
var currUrl = window.location.href;
var params = (currUrl.split('?')[1]).split('&');
var url = "<?= $lang->url ?>/tashev-183?";
for(var i=0; i<params.length; i++){
var keyValuePair = params[i].split('=');
if(keyValuePair[0] != elemName && keyValuePair[0] != "view" && keyValuePair[0] != "producer"){
keyValuePair[1] = "";
params[i] = [keyValuePair[0], keyValuePair[1]];
}else{
params[i] = [keyValuePair[0], keyValuePair[1]];
}
var urlPiece = params[i].join("=");
if(i < params.length - 1){
url += urlPiece + "&";
}else{
url += urlPiece;
}
}
var stateObj = { prevPage: url };
var path = '/' + url;
history.pushState(stateObj, "category page", path);
}
我知道它变得有点乱(因为我可能)但是会感谢任何建议! :)