【问题标题】:'ui-sref' of Angular UI-Router not working as expectedAngular UI-Router 的“ui-sref”未按预期工作
【发布时间】:2017-05-16 17:38:26
【问题描述】:

如果我使用 href,UI 路由器会按预期工作。但是,如果我使用的是 ui-sref,它就无法按预期工作。

我对以下示例有两个问题:

  • 锚点“link-series-2-no-param”和“link-series-2-one-param”不会触发“否则”(它们在“link-series-1”中会触发)。如果他们需要去“否则”怎么办?
  • 如果您单击所有“link-series-2”并反向执行相同操作,它将不起作用(始终显示“link-series-2-two-params”的结果,即使您单击其他)

a01.htm:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js" ></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.2/angular-ui-router.min.js" ></script>
    <script type="text/javascript" src="a01.js"></script>
...
<a ui-sref='root'>Home</a>
    <br>
    <a href='#/demo1/'>link-series-1-no-param</a>
    <a href='#/demo1/30'>link-series-1-one-param</a>
    <a href='#/demo1/30/40'>link-series-1-two-param</a>
    <br>
    <a ui-sref-opts="{reload: true, notify: true}" ui-sref='demo1'>link-series-2-no-param</a>
    <a ui-sref-opts="{reload: true, notify: true}" ui-sref='demo1({a: 30})'>link-series-2-one-param</a>
    <a ui-sref-opts="{reload: true, notify: true}" ui-sref='demo1({a: 30, b:40})'>link-series-2-two-param</a>
    <hr>
    <div ui-view></div>

a01.JS:

var app = angular.module('app', ['ui.router']);

app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider){
    $stateProvider
    .state('demo1', {
        url: '/demo1/:a/:b', 
        templateUrl: 'demo1.htm',
        controller: 'demo1'
    })
    .state('root', {
        url: '/',
        template: '<strong>you are at root..click something else</strong>'
    });

    $urlRouterProvider.otherwise("/");
}]);

app.controller('demo1', ['$scope', '$stateParams', function($scope, $stateParams){
    $scope.a = $stateParams.a;
    $scope.b = $stateParams.b;
    console.log('a = ' + $stateParams.a + ', b = ' + $stateParams.b);
}]);

demo1.htm:

<div>
    a = {{a}}, b = {{b}}
</div>

我在上面的示例中缺少什么?

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    在这种情况下所经历的行为来自我们使用$state.go 选项的事实:{ reload: true }

    <a ui-sref-opts="{reload: true ...
    

    查看文档https://ui-router.github.io/docs/0.3.1/#/api/ui.router.state.$state#methods_go

    reload (v0.2.5) - {boolean=false|string|object},如果为 true,即使状态或参数没有改变,也会强制转换。它将重新加载当前状态和父状态的解析和视图...

    this example 中,我们可以看到,任何ui-sref,即使缺少参数,也会被导航到...,因为它是强制

    但是,如果我们将使用默认的 (native) 方法,那么只有在有任何更改 (例如参数更改) 时才会重新加载该状态。

    That example 表明了这一点

    <a ui-sref-opts="{reload: false ...
    

    直到任何参数被更改 - 不会触发状态更改。希望对您有所帮助...

    【讨论】:

    • 明白。但是,即使使用“reload:true”并更改参数,如果我们开始单击所有“link-2”系列(按顺序)并反向执行相同操作,结果也不一致。
    • 具体来说,如果我们点击link-2-series-two-param之后的link-2-series-one-param(params有差异的地方),它不会reload for link -2-series-one-param
    • 这里的重点是 - 使用 $state.go,即使用 ui-sref,我们会从上一次运行中获得 $stateParams。因此,如果 :b 的值已经被传递......现在丢失了,它仍然会在那里......被重用。如果这是一个错误,我不确定。我会说什么?如果可能,请不要在这里浪费时间。尝试调整您的应用程序以将两个参数都传递到 ui-sref。 IE。显式 NULL 或 -1 ...
    • 请检查这个调整后的 plunker plnkr.co/edit/ERmnRdSO3oXf7U8OzG2U?p=previewui-sref='demo1({a: 30, b: null})' 希望对您有所帮助
    • plnkr.co/edit/69YrDr8ZsyZCQc4aQoWl?p=preview 如果不想继承现有的参数值,请使用{inherit: false}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2015-01-23
    相关资源
    最近更新 更多