【问题标题】:Angularjs is changing URL back to original causing issue [duplicate]Angularjs 将 URL 更改回原来的导致问题 [重复]
【发布时间】:2013-12-21 17:03:29
【问题描述】:

我的应用程序基于单页模型。我正在使用 JQuery History 对象来更改 URL,以便如果用户刷新应用程序,那么当用户刷新浏览器时我可以保留应用程序的位置。它工作得很好,但不知何故它停止了工作。经过分析,我发现 Angular.js 正在将修改后的 URL(由 Jquery History API 修改)更改为原始 URL(用于启动应用程序的 URL)。我很惊讶和困惑为什么突然 Angular JS 开始重置 URL。我尝试了很多,但找不到任何根本原因。请帮助并建议其他可能的方法,以在浏览器刷新(或后退按钮)上保留用户位置。以下是更多详细信息。

//Change the browser state to support History to launch file. It will remove projectid from URL and will add fileid
function updateBrowserStateOnFileLaunch(fileId, pageTitle, stateCounter)
{
    //Get current URL
    var finalURL = getNormalizedHashedURL("");
        //Remove projectid query string from paramter if it has and update/add fileid
        finalURL = updateQueryStringParameters(finalURL, [{key:"projectid", value:undefined}, {key:"fileid", value:fileId}]);   
    //Change history
    History.pushState({state:stateCounter,rand:getTimestampId()}, pageTitle, finalURL); 
}

注意:不添加有关“getNormalizedHashedURL”和“updateQueryStringParameters”方法的详细信息以保持帖子小。

我正在使用 ng-if 根据状态更改视图。

<!-- File editor view -->
        <div data-ng-if="currentView === 3">    
<!-- Project File view-->
</div>

在调试期间,我看到 angular.js 在执行以下行后正在重置 URL。

我的应用程序中尝试从服务器获取数据的代码:

 //get list of templates by making server call using Angular $resource object
            Template.query({projectid: project._id}, function(response) {
//Processing of response
});

angular.js 中正在重置 URL 的代码:

 $apply: function(expr) {
        try {
          beginPhase('$apply');
          return this.$eval(expr);
        } catch (e) {
          $exceptionHandler(e);
        } finally {
          clearPhase();
          try {
            $rootScope.$digest(); **//At this line I find that URL is getting reset**
          } catch (e) {
            $exceptionHandler(e);
            throw e;
          }
        }
      },

请帮忙。

【问题讨论】:

    标签: jquery angularjs angular-resource


    【解决方案1】:

    来自Turn off URL manipulation in AngularJS

    angular.module('sample', [])
        .config( ['$provide', function ($provide){
            $provide.decorator('$browser', ['$delegate', function ($delegate) {
                $delegate.onUrlChange = function () {};
                $delegate.url = function () { return ""};
                return $delegate;
            }]);
        }]);
    

    ES6 变体:

    angular.module('sample', [])
        .config(["$provide", $provide => {
            $provide.decorator("$browser", ["$delegate", $delegate => {
                $delegate.onUrlChange = () => { };
                $delegate.url = () => "";
    
                return $delegate;
            }]);
        }]);
    

    【讨论】:

    • 这很完美。为我节省了很多时间。
    • 非常感谢伙计!几个小时后.. ;)
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多