Yii2使用afterAction mehtod来激活js函数

时间:2017-10-13 06:17:10

标签: javascript yii2 pushstate

我正在尝试使用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);
    }

我知道它变得有点乱(因为我可能)但是会感谢任何建议! :)

0 个答案:

没有答案