工厂注射完成后控制器执行?

时间:2014-08-08 02:09:40

标签: angularjs

这是一个两部分问题:

我的网页上有一个空div

<div class="row-fluid">
    <div id="SLR" ng-controller="userMenuController">
           //Angular inject HTML here
    </div>
</div>

我的理解是ng-Controller导致执行以下功能:

app.controller('userMenuController', ['$scope', function($scope, authFactory){

    $scope.init = function(authFactory) {

        var menu = authFactory.getLoginModuleHtml()($scope);

        $("#SLR").html(menu);

    };

    $scope.init();

My First问题是即使authFactory作为依赖项注入控制器仍然未定义,因此我的init()函数失败。为什么是这样?这是我的工厂:

app.factory('authFactory', function(){

   var factory = {};

   factory.getLoginModuleHtml = function(){

        var html = '';

        if(userLoggedIn){

            html =
                '<div class="row-fluid" ng-controller="loginMenuController">' +
                '<div class="dropdown">' +
                'Hi user!' +
                '</div>';
        } else {
            html =
                '<div class="row-fluid" ng-controller="loginMenuController">' +
                '<div class="dropdown">' +
                'Click to login!' +
                '</div>';
        }

        return html
    }

    return factory;
});

我的第二个问题是,我是否以正确的方式将HTML放在页面上?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

第一个回答:

你没有正确地注射你的工厂,它应该是这样的:

app.controller('userMenuController', ['$scope','authFactory', function($scope, authFactory){

    $scope.init = function(authFactory) {

        var menu = authFactory.getLoginModuleHtml()($scope);

        $("#SLR").html(menu);

    };

    $scope.init();
}]);

对于第二个,答案是,你永远不应该从你的控制器处理html标签,总是使用指令。

在您的情况下,如果用户已登录或未记录,您的html正在更改,我建议使用基于路由的解决方案,以便您可以在必要时将用户重定向到登录路由,并且仅允许用户在他/她正确登录时查看其他页面。