使用独立的AngularJS控制器修复竞争条件

时间:2013-11-10 19:17:02

标签: javascript angularjs race-condition

在我的Angular应用程序中,我有一个根据路径更改的主视图,然后是无论如何显示的侧边栏。我的HTML看起来像这样:

<div id="container">
    <div id="sidebar" ng-controller="SidebarCtrl">(sidebar code)</div>
    <div ng-view id="content">Loading...</div>
</div>

javascript按此顺序加载:

  1. Vendor.js(angular等)
  2. App.js(我的申请)
  3. SidebarCtrl在App.js中定义。然而,当Angular加载时,它会看到ng-controller指令,并尝试将其直接分配到侧边栏,导致“参数SidebarCtrl不是函数”错误,除非app.js被缓存。我想将侧边栏放在一个单独的文件中并在Vendor.js之前加载它,但侧边栏依赖于App.js中定义的一些服务(即我的自定义身份验证服务):

    MyApp.controller('SidebarCtrl', 
    ['$scope', '$location', 'auth', function($scope, $location, auth) {
        (...)
    }])
    

    所以无论哪种方式我都不知所措。

    我确信有更好的方法来设置它...任何想法?我可以将SidebarCtrl定义为一个简单的函数,但仍然可以访问auth服务吗?

    由于

1 个答案:

答案 0 :(得分:1)

当您的应用加载时,您可以动态ng-controller属性添加到sidebar

var $self = angular.element('.sidebar');
$self.attr('ng-controller', window.USER_LOGGED_IN ? 'sidebarCtrl' : 'noUserCtrl');
angular.bootstrap(angular.element('body'));

当要使用的控制器取决于应用程序状态时,此方法很有用。在您的情况下,angular.bootstrap应该可以解决问题。

Source