后箭头和角度路由 - 按两次后退

时间:2013-12-09 13:34:18

标签: angularjs angularjs-routing

Angularv1.1.5

网站:http://tilsa.azurewebsites.net

我有一个非常简单的路由设置,但是当用户从默认/ home路由转到detail(pregunta)路由然后单击后退按钮时没有任何反应。第二次/第三次单击后退按钮时,用户将(chrome)返回到默认/ home路径。我不确定这是怎么发生的。

$routeProvider.
when('/', {
    templateUrl: '/js/app/partial/index.html',
    controller: 'IndexCtrl'
})
.when('/pregunta/:id', {
    templateUrl: '/js/app/partial/detalle.html',
    controller: 'PreguntaDetalleCtrl'
}).
otherwise({
    redirectTo: '/'
});

以下是两个相关的控制器。我删除了一些似乎不相关的代码(轮询新信息/等):

// load the index list of questions, the actual questions are loaded in parent scope

.controller('IndexCtrl', ['$scope', 'services', 'data', '$modal', 'navigation', 'timeFunctions', function ($scope, services, data, $modal, navigation, timeFunctions)
{
    $scope.noEncodeUrl = 'http://tilsa.azurewebsites.net/';

    $scope.url = encodeURIComponent($scope.noEncodeUrl);
    // controls the back arrow visibility to go back
    navigation.setReturn(false);

}])
.controller('PreguntaDetalleCtrl', ['$scope', '$routeParams', 'services', 'navigation', 'graphService', 'stringFx', '$timeout', 'timeFunctions',  function ($scope, $routeParams, services, navigation, graphService, stringFx, $timeout, timeFunctions) {

    $scope.notas = [];

    $scope.comentario = '';

    navigation.setReturn(true);

    $scope.loadPregunta = function (id, loadComments)
    {
        services.preguntas.getDetalle(id).then(function (data)
        {
            $scope.safeApply(function ()
            {
                $scope.pregunta = data;
                graphService.setProp('title', $scope.pregunta.pregunta);
                $scope.noEncodeUrl = 'http://tilsa.azurewebsites.net/pregunta/' + id;

                $scope.url = encodeURIComponent($scope.noEncodeUrl);
                $scope.preguntaText = stringFx.removeAccent('¿'+$scope.pregunta.pregunta+'?');

            });

            if (loadComments)
            {

            $scope.commentTracker = {
                defaults: {             },
                skip: 0,
                take: 20
            };

            $scope.$on('$destroy', function (e)
            {
                $scope.stopPolling();
            });

            $scope.startPolling = function ()
            {

                // scrollTimeout will store the unique ID for the $setInterval instance
                return $scope.scrollTimeout = timeFunctions.$setInterval(poll, 10000, $scope);

                // Function called on interval with scope available
                function poll($scope)
                {
                    services.preguntas.getNotas($scope.pregunta.id, $scope.commentTracker, $scope.notas).then(function (data)
                    {


                        $scope.safeApply(function ()
                        {
                            for (i = 0, l = data.notas.length; i < l; i++)
                            {
                                $scope.notas.unshift(data.notas[i]);
                            }
                        });



                    });

                }
            }

            $scope.stopPolling = function ()
            {
                return timeFunctions.$clearInterval($scope.scrollTimeout);
            }

            $scope.startPolling();


            $scope.cargarAnteriores = function ()
            {
                //$scope.commentTracker.skip++;

                services.preguntas.getNotas($scope.pregunta.id, $scope.commentTracker, $scope.notas, true).then(function (data)
                {
                    $scope.safeApply(function ()
                    {
                        $scope.notas = $scope.notas.concat(data.notas);
                        $scope.masNotas = $scope.notas.length > 0;
                    });


                });

            }

            $scope.cargarAnteriores();
            }

        });

    }



    $scope.notaNueva = function () {
        //$scope.commentario;


        if ($scope.comentario.length < 3)
        {
            alert('Escribe algo mas, no seas tacano con tus palabras');
            return;
        }
        $scope.processing = true;

        services.preguntas.insertNota($scope.pregunta.id, $scope.comentario, $scope.notas, false).then(function (data)
        {

            $scope.comentario = '';
            $scope.processing = false;

            $scope.loadPregunta($scope.pregunta.id, false);

            services.preguntas.getNotas($scope.pregunta.id, $scope.commentTracker, $scope.notas).then(function (data)
            {

                $scope.safeApply(function ()
                {
                    for (i = 0, l = data.notas.length; i < l; i++)
                    {
                        $scope.notas.unshift(data.notas[i]);
                    }
                });

            });

        });
    }

    $scope.loadPregunta($routeParams.id, true)

    $scope.$on('updatedpregunta', function (event, obj)
    {
        $scope.loadPregunta(obj, false)

    });

}]);

2 个答案:

答案 0 :(得分:1)

我也有这个问题!转过来,artur grzesiak是对的!我的页面上有一个iframe,它的src属性有一个绑定。

<iframe src="{{selected.url}}"></iframe>

由于$ scope.selected.url的默认值为null,所以发生的第一件事是它正在加载一个名为null的URL。

经过一番研究后,我发现iframe有一个特殊的指令:

<iframe ng-src="{{selected.url}}"></iframe>

这个改变解决了我的问题

答案 1 :(得分:0)

看来您应用的Angular方面很好。

99%的问题是由一些外部库引起的。确定这个脚本kVEquaeit4R存在一些问题(它看起来像是一个facebook插件),因为它无法加载某些资源( 404错误):你所拥有的资源寻找已删除,更改名称或暂时不可用。因此会产生一些其他错误(请查看控制台)。反过来,它会阻止应用调用window.location.hostname.replace kVEquaeit4R脚本中实际存在的内容。

所以我的建议如下:从您的网站中删除此fb插件并检查routing是否正常工作...