angularjs $location.path仅在第二次单击时更新URL

前端之家收集整理的这篇文章主要介绍了angularjs $location.path仅在第二次单击时更新URL前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在处理的网站有一个自定义CMS,我正在使用 angularjs进行内联页面编辑.数据库存储用于生成页面HTML,因此我无法严格使用客户端模板和模型.

我没有使用HTML5 pushState,因此URL类似于example.com/page#/widget/1/edit或example.com/page#/widget/new,我当前的问题是当我提交表单进行编辑时一个小部件或添加一个小部件,然后我希望页面通过将HTML注入DOM并将URL更改为默认值来重新加载其内容,我正在尝试使用$location.path(‘/’).

我当前的实现有多个问题(您将在演示中看到),其中一个是在我的表单submit()回调中,更改$location.path只更改第二个表单按钮单击时的URL.我也尝试更改单击“删除”的URL,但这也不起作用.

http://jsfiddle.net/sZrer/1

customPage.controller('PageEditCtrl',function($scope,$http,$routeParams,$location,$route,$compile,PageState) {
    var widgetId = $routeParams.id || widgetCount + 1;

    $scope.pageState = PageState;
    $scope.widget = { id: widgetId,name: 'Widget ' + widgetId };
    $scope.submit = function() {
      if ($scope.widget.id > widgetCount) widgetCount += 1;
      setTimeout(function() {
        var element = $compile(genHtml())($scope);
        angular.element('#page-content').html(element);
        $location.path('/');
      },100);
    };
  });

解决方法

setTimeout()与Angular不能很好地混合(Angular使用一个事件循环来检查模型的变化,但是为了能够做到这一点,它必须能够控制你app的所有部分; setTimeout()超出了Angular的控制,当你的应用程序的Angular部分的任何更改在setTimeout-handler中进行时,它通常需要另一个’round’的Angular事件循环才能获取这些更改).

如果用Angular自己的$timeout()替换它(确保也注入它),它会更好(jsfiddle).

猜你在找的Angularjs相关文章