Angularjs的两个ng控制器可以解决HTML标记中的冲突

angularjs two ng controllers with resolve conflict in html markup

本文关键字:HTML 解决 冲突 控制器 ng 两个 Angularjs      更新时间:2023-09-26

config.router.js

app.config(['$stateProvider', '$urlRouterProvider', '$controllerProvider', '$compileProvider', '$filterProvider', '$provide', '$ocLazyLoadProvider', 'JS_REQUIRES',
function ($stateProvider, $urlRouterProvider, $controllerProvider, $compileProvider, $filterProvider, $provide, $ocLazyLoadProvider, jsRequires) {
    app.controller = $controllerProvider.register;
    app.directive = $compileProvider.directive;
    app.filter = $filterProvider.register;
    app.factory = $provide.factory;
    app.service = $provide.service;
    app.constant = $provide.constant;
    app.value = $provide.value;
    // LAZY MODULES
    $ocLazyLoadProvider.config({
        debug: false,
        events: true,
        modules: jsRequires.modules
    });
    // APPLICATION ROUTES
    // -----------------------------------
    $urlRouterProvider.otherwise('/login/signin');
    //
    // Set up the states
    $stateProvider.state('app', {
        url: "/app",
        templateUrl: "assets/views/app.html",
        resolve: loadSequence('modernizr', 'moment', 'angularMoment', 'uiSwitch', 'perfect-scrollbar-plugin', 'toaster', 'ngAside', 'vAccordion', 'sweet-alert', 'chartjs', 'tc.chartjs', 'oitozero.ngSweetAlert', 'chatCtrl'),
        abstract: true
    }).state('app.dashboard', {
        url: "/dashboard",
        templateUrl: "assets/views/dashboard.html",
        resolve: loadSequence('jquery-sparkline', 'dashboardCtrl'),
        title: 'Dashboard',
        ncyBreadcrumb: {
            label: 'Dashboard'
        }
    })
...


loginCtrl.js

app.controller('LoginCtrl', ["$scope", "alert", "auth", "$state", "$auth", "$timeout", function ($scope, alert, auth, $state, $auth, $timeout) {
    $scope.submit = function () {
        $auth.login({
            email: $scope.email,
            password: $scope.password
        })
            .then(function(res) {
                var message = 'Thanks for coming back ' + res.data.user.email + '!';
                if (!res.data.user.active)
                {$auth.logout();
                    message = 'Just a reminder, please activate your account soon :)';}
                alert('success', 'Welcome', message);
                return null;
            })
            .then(function() {
                $timeout(function() {
                    $state.go('main');
                });
            })
            .catch(handleError);
    } // submit function for login view
    function handleError(err) {
        alert('warning', 'oops there is a problem!', err.message);
    }
}]);


main.js

var app = angular.module('myApp', ['my-app']);
app.run(['$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams) {
    // Attach Fastclick for eliminating the 300ms delay between a physical tap and the firing of a click event on mobile browsers
    FastClick.attach(document.body);
    // Set some reference to access them from any scope
    $rootScope.$state = $state;
    $rootScope.$stateParams = $stateParams;
    // GLOBAL APP SCOPE
    // set below basic information
    $rootScope.app = {
        name: 'My App', 
        author: 'example author', 
        description: 'My Platform', 
        version: '1.0', 
        year: ((new Date()).getFullYear()), 
        isMobile: (function () {
            var check = false;
            if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
                check = true;
            };
            return check;
        })()
    };
    $rootScope.user = {
        name: 'Peter',
        job: 'ng-Dev'
    };
}]);

问题是当我将ng-controller="loginCtrl"添加到我的登录div上的html文件进行登录时,它可以工作。但是我在logindiv下面有另一个div:

<div class="copyright" >
    {{app.year}} &copy; {{ app.name }} by {{ app.author }}.
</div>

这行不通!但是,我在logindiv上面有一个类似的,它可以工作:

<div class="logo">
    <img ng-src="{{app.layout.logo}}" alt="{{app.name}}"/>
</div>

问题在哪里?如何解决这个问题?由于

如果你使用的是角ui-router,没有必要手动添加ng-controller="loginCtrl"到你的div,而不是添加controller属性在你的$stateProvider.state

的例子:

.state('app.dashboard', {
        url: "/dashboard",
        templateUrl: "assets/views/dashboard.html",
        title: 'Dashboard',
        controller: 'dashboardCtrl',
        resolve: {
                    deps: ['$ocLazyLoad', function ($ocLazyLoad) {
                        return $ocLazyLoad.load('path/to/your/controller.js');
                    }]
                },
        ncyBreadcrumb: {
            label: 'Dashboard'
        }
    })

当你改变状态时视图通常会变成,这就是重点,对吧?动态设置控制器可能不会像您期望的那样工作。

签出文档