AngularJS中相同URL的两个状态

时间:2015-01-28 17:15:52

标签: javascript angularjs

我在我的应用中设置了以下路由:

$stateProvider
    .state('splash',
    {
        url: '/',
        views: {
            'all': {
                templateUrl: 'partials/splash.html'
            }
        }
    })
    .state('home',
    {
        url: '',
        views: {
            'all': {
                templateUrl: 'partials/home.html'
            }
        }
    })
    .state('contents',
    {
        url: '/contents',
        views: {
            'all': {
                templateUrl: 'partials/contents.html'
            }
        }
    })

因此,当应用程序首次加载时,用户会看到启动页面,然后单击加载主页状态的启动模板中的按钮。这允许我有一个没有历史记录或URL的状态,因此用户无法通过浏览器后退按钮返回到启动页面(除非他们刷新页面)。

问题在于,当用户然后导航到内容页面时(再次通过主页上的按钮),这会创建一个历史记录条目并允许用户返回(这很好),但是按下后退按钮需要用户返回启动状态而不是本地状态...

我该怎么办?

2 个答案:

答案 0 :(得分:1)

由于我没有看到上述状态中声明的控制器,我假设您的模板声明了控制器。所以..你可以通过在变量中保存数据来动态更改templateUrl,这是一个黑客:

var splashVisits = 0;
localStorage.setItem('splashVisit', JSON.stringify(splashVisits )); // save this in a service actually or like so in localStorage when app loads
$stateProvider
    .state('splash',
    {
        url: '/',
        views: {
            'all': {
                // make the template url a function which returns a different template based on number of splash visits.
                templateUrl: function(){
                    // read splashVisits
                    splashVisits = JSON.parse(localStorage.getItem('splashVisits')); // returns some value
                    if(splashVisits == 0){ 
                        splashVisits++;
                        localStorage.setItem('splashVisit', JSON.stringify(splashVisits ));
                        return 'partials/splash.html';
                    }
                    else 
                        return 'partials/home.html';
                }
            }
        }
    })

我自己没有尝试过这个,但我知道templateUrl接受了一个函数。如果你设置了一个有助于测试它的plunker / jsfiddle。

更新

$stateProvider
.state('splash',
{
    url: '/',
    controllerProvider: function($stateParams) {
        var ctrlName = null;
        splashVisits = JSON.parse(localStorage.getItem('splashVisits')); 
        if(splashVisits == 0){ 
            ctrlName = 'HomeCtrl';
        }
        return ctrlName;
    }
    views: {
        'all': {
            templateUrl: function(){
                // read splashVisits
                splashVisits = JSON.parse(localStorage.getItem('splashVisits')); // returns some value
                if(splashVisits == 0){ 
                    splashVisits++;
                    localStorage.setItem('splashVisit', JSON.stringify(splashVisits ));
                    return 'partials/splash.html';
                }
                else {
                    // force state change?
                    return 'partials/home.html';
                }
            }
        }
    }
})
.state('home', 
{ 
    url: '', 
    controller: 'HomeCtrl', 
    views: { 
        'all': { 
            templateUrl: 'partials/home.html' 
        } 
    } 
})
.state('contents',
{
    url: '/contents',
    views: {
        'all': {
            templateUrl: 'partials/contents.html'
        }
    }
})

答案 1 :(得分:0)

基于@SoluableNonagon的回答

此代码解决了问题:

var splashVisits = 0;
localStorage.setItem('splashVisits', JSON.stringify(splashVisits));

$stateProvider
    .state('splash',
    {
        url: '/',
        views: {
            'all': {
                templateUrl: function(){

                    splashVisits = JSON.parse(localStorage.getItem('splashVisits'));

                    if(splashVisits > 0) {
                        return 'partials/home.html';
                    }
                    else {
                        splashVisits++;
                        localStorage.setItem('splashVisits', JSON.stringify(splashVisits));
                        return 'partials/splash.html';
                    }
                }
            }
        }
    })
    .state('home',
    {
        url: '',
        views: {
            'all': {
                templateUrl: 'partials/home.html'
            }
        }
    })