更改URL而无需删除Angularjs的历史



我正在使用'ui.router'和'$ state.go'重定向页面,

我项目的

'navbar'看起来像这样。

<ul class="sidebar-menu">
    <li class="active">
        <a ui-sref="root.menu({brand_id:nav.brand_id})">
            <i class="fa fa-building-o"></i>
            <span> {{nav.navInfo.menu.auth_name}}</span>
        </a>
    </li>
    <li>
        <a ui-sref="root.picture({brand_id:nav.brand_id})">
            <i class="fa fa-book"></i>
            <span> {{nav.navInfo.picture.auth_name}}</span>
        </a>
    </li>
    ...
</ul>

每个页面显示表格,首先具有项目列表。

让我们假定的情况。

当我在"菜单"页面中时,我搜索一个关键字。

按照我的代码,URL更改包括关键字。

例如,这就像

一样

搜索之前

/menu?page=1&offset=0&limit=10

搜索后

/menu?page=1&offset=0&limit=10&searchKey=menu_name&searchString=pizza

然后,我单击" navbar"中的"菜单"选项卡以再次获取整个列表。

此时,我想使用触发ui-sref$(location)或其他东西更改URL。

使用$(location).attr('href', url)时,成功更改URL

但是,如果我单击"浏览器"返回按钮,则浏览器历史记录无法维护。

,而且我也使用了window.location.hrefwindow.location.replace,但结果相同。

在这种情况下如何维护历史?

我已经准备好尝试所有建议!

PS

如果这是不够的解释,请给我反馈。

实际上,我不知道如何更具体地解释这一点。:(

我已经在" JS"中尝试了一下,而不是"控制器"。

没有特殊原因我在" JS"中做到了。

我认为这可能更简单。

预先感谢!

update

我可以通过单击" navbar"上的每个选项卡来更改页面。

这使用ui-sref和Perfect。

我的主要问题是,例如,当'.Active'类都在'菜单'选项卡中时,

再次单击"菜单"选项卡,ui-sref不起作用。

所以我使用了 $locationwindow或'js'中的东西,

之后,我得到的是'删除历史记录'

当我单击"菜单"选项卡时,我想在初始化状态中制作页面。

单击选项卡

/menu?page=1&offset=0&limit=10&searchKey=menu_name&searchString=pizza

单击选项卡

/menu?page=1&offset=0&limit=10

又是,我将?page=1&offset=0&limit=10手动放入URL,

所以我要做的就是触发ui-sref 更改URL而不删除历史记录。

好吧,如果您使用的是角路由器,请勿使用window.location$(location)更改页面URL和位置。Angular Router具有自己这样做的机制,即$state

您需要首先在控制器中注入$state,然后可以使用:

$state.go('yourStateHere');

这将使所有跟踪浏览器中的历史记录保持。

注意:

请确保您的状态在app.js中定义得很好,我的意思是您需要定义serach页面的各自状态,以使所有搜索参数consivertaion。

有关更多详细信息,您可以检查:

  • ui-router快速参考
  • StateProvider参考
  • 使用UI-Router 教程的AngularJS路由。

您是否尝试使用Angular Service $location?例如:

$location.path("/main_page");

然后您可能需要使用$scope.$applyAsync();

update (在下面的评论之后)

services.service("$way", ["$location", function ($location) {
    var self = this;
    var lastBack;            //last page where you was
    this.way = new Array();
    var LIMIT_LENGTH = 30;   //limit of route history
    var curScope = null;     //current scope
    var active = true;       //is service active
    this.step = function (path, $scope) {
        curScope = $scope;
        if (lastBack != path) {
            lastBack = null;
            this.way.push(path);
            if (this.way.length > LIMIT_LENGTH) {
                this.way.shift();
            }
        }
    }
    this.goBack = function () {
        if (active) {
            var path = back();
            lastBack = path;
            if (path != "/") {
                $location.path(path);
                curScope.$applyAsync();
            }
        }
    }
    this.setActive = function (_active) {
        active = _active;
    }
    this.refresh = function () {
        this.way = new Array();
    }
    function back() {
        if (self.way.length > 1) {
            self.way.pop();
            Log.o("WAY_BACK", self.way);
            return self.way[self.way.length - 1];
        }
    }
}]);

示例:

$way.step("/blog", $scope);  //add page to path
$way.step("/main", $scope);  //add page to path
$way.goBack(); // now you on /blog page

最新更新