使用Angular中的UI-Router禁用URL更改?

时间:2016-09-08 13:29:29

标签: angularjs angular-ui-router

是否可以在Angular 1.5应用程序中配置ui-router以完全忽略地址栏?

期望的行为是这样的:

  • 通过UI在状态之间导航不会更改URL
  • 更改URL不会导致状态之间的导航,只会导致UI或程序化操作(单击按钮等)
  • 点击F5从“默认”控制器
  • 重启应用程序
  • 原始网址(尤其是查询参数)仍然可以访问

更新:我正在使用非常具体的用例创建应用程序,而不是网站。普通的网页浏览实践不适用于此处。即使它看起来与常识相矛盾,也请接受它们的要求。

1 个答案:

答案 0 :(得分:3)

同意如果我们考虑经典的网络应用程序,所述方法并不好。

我尝试创建一个满足您需求的示例应用程序。 以下是我的水果应用程序中我的路由器配置(router.config.js)文件的样子:

.state('start', {
            url: '/',
            templateUrl: '../app/start/start.html',
            controller: 'startCtrl as vm',                
        })
.state('fruits', {              
            templateUrl: '../app/fruits/fruitshtml',
            controller: 'fruitsCtrl as vm',              
        })
.state('fruits.details', {
       params: {
                   fruitId: undefined
               },
               templateUrl: '../app/fruits/fruitdetails.html',
               controller: 'fruitDetailsCtrl as vm'
        })

国家解释:

start: url /是我的申请的入口点。如果url为/,则会加载start状态。

fruits: 此状态显示我的应用程序中的水果列表。请注意,此状态没有定义url。所以,如果我们进入这个状态,url就不会改变(State会改变,但是url不会改变)。

fruits.details: 此状态应显示标识为fruitId的水果的详细信息。请注意,我们已在params中传递了fruitId。 params用于传递参数而不使用url!因此,对参数的传递进行了排序。我可以写ui-sref="fruit.details({ fruitId: my-fruit-id })"导航到fruit.details状态,并用fruitId my-fruit-id显示我的水果的详细信息。

正如您可能已经知道的那样,主要的想法是使用状态作为导航手段。

我的应用程序是否通过您的积分?

  1. 通过UI在状态之间导航不会更改URL
  2. 更改URL不会导致状态之间的导航,只会导致UI或程序化操作(单击按钮等)
  3. 点击F5从“默认”控制器
  4. 重启应用程序
  5. 原始网址(尤其是查询参数)仍然可以访问
  6. - >

    1. pass:因为我们没有为状态定义url
    2. 传递:更改网址将更改为状态为start。该应用程序不会将用户带到任何不同的状态,但它会将状态更改为start,或者我们可以说我们的默认状态。
    3. 传递:刷新将带您进入start
    4. 传递:如果您在网址中写下start,那么您的应用就会启动状态。
    5. <德尔> 可能解决第二点,它没有完全传递:我们可以编写代码来检查传递的url(在startCtrl控制器中)。如果url包含附加到/ start的额外内容,请转到上一个状态。如果url是'start',请继续加载开始页面。

      <强>更新 正如OP @Impworks所指出的那样,如果我们将启动状态的url设置为/,则也会传递第二点的解决方案。这样,如果我们将任何字符串附加到url,状态将不会改变。