Angular app不会加载初始页面

时间:2013-12-17 09:17:38

标签: javascript angularjs requirejs

在我正在开发的Angular应用程序中,第一页调用不会导致加载正确的路径模板(仅显示菜单栏)。只有当我点击另一个链接并返回到原始链接时,才会加载正确的页面。

首页加载是否存在任何已知问题,或者我可以采取哪些措施来调试此问题?

一些上下文:我正在使用Angularjs(v1.2.0-rc.2)和requirejs(还有更多,但它们应该是无关紧要的)。我不能提供一个最小的工作示例,因为我不知道要删除什么,现在是什么。我也有一些页面暂时没有出现这个问题,但现在(在其他页面上进行了一些更多的开发之后),这些问题表现出相同的行为。任何指针都赞赏......

更新

根据要求,路由配置的示例。它们看起来非常相似;一些静态部分和一些ID。

mod.config(function ($routeProvider) {
  $routeProvider.when('/some/:id/route/to/somewhere', {
    controller: 'MyController',
    templateUrl: '/template/some.template.html'
  });
});

更新2

在逐步完成Angular代码之后,我发现在angular.js的此代码段中初始处理新网址时,没有向事件$locationChangeSuccess注册处理程序。

// update browser
var changeCounter = 0;
$rootScope.$watch(function $locationWatch() {
  var oldUrl = $browser.url();
  var currentReplace = $location.$$replace;

  if (!changeCounter || oldUrl != $location.absUrl()) {
    changeCounter++;
    $rootScope.$evalAsync(function() {
      if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
          defaultPrevented) {
        $location.$$parse(oldUrl);
      } else {
        $browser.url($location.absUrl(), currentReplace);
        afterLocationChange(oldUrl);
      }
    });
  }
  $location.$$replace = false;

  return changeCounter;
});

return $location;

function afterLocationChange(oldUrl) {
  $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);
}

只有在第一页加载处理完成后,在angular-route.js中,此行才会执行$rootScope.$on('$locationChangeSuccess', updateRoute);(我相信这会导致路由工作并且视图可以正确显示)。 URL的每次后续更改都可以正常工作......也许这是由于我初始化角度的方式。我用:

angular.element(document).ready(function() {
  angular.bootstrap(document, ['some', 'more', 'modules', 'ngRoute']);
});

我也更新到v1.2.5,但对我的问题没有影响。

4 个答案:

答案 0 :(得分:1)

这可以解决方法:

myApp.run(['$route', function($route)  {
  $route.reload();
}]);

https://github.com/angular/angular.js/issues/1213找到。

答案 1 :(得分:0)

尝试:

mod.config(['$routeProvider', function ($routeProvider) {
  $routeProvider.when('/some/:id/route/to/somewhere', {
    controller: 'MyController',
    templateUrl: '/template/some.template.html'
  });
  $routeProvider.otherwise({
    // If you don't have any route named '/', this will be the default.
    redirectTo: '/some/route' // or '/some/route/:with/params'
  });
}]);

答案 2 :(得分:0)

另一种可能的解决方法

var initApp = function () {
    angular.bootstrap(document.body, ['loginApp']);
    document.body.className += ' ng-app';
}
if ( document.body.className.indexOf('ng-app') == -1 ) {
    initApp();
}

答案 3 :(得分:0)

我理解的问题是路由器尚未启动。我遇到过同样的问题。在app.run中包含$ route就足以启动路由器了。

app.run(['$rootScope', '$route', function ($rootScope, $route) {
   // Include $route to kick start the router.
}]);