如何正确使用AngularJS中的多个控制器?

时间:2013-12-13 07:19:00

标签: javascript angularjs

我开始使用AngularJS,据我所知,我可以为网页的不同部分设置不同的控制器。我有问题让它工作。我的页面有两部分,每部分对应ng-controller - JSFiddle。只有先到的部分才有效。例如,目前app1工作正常,但当我将其移到app2以下时,只有app2正常工作。可能有什么不对?非常感谢有关此行为和任何链接的原因的任何解释。

4 个答案:

答案 0 :(得分:65)

您可以拥有多个控制器,但在同一页面上不能有多个ng-app指令。这意味着您的html中只应该有一个ng-app指令,指向将在您的应用程序中使用的单个模块。

然后定义此模块并在此模块中定义所有控制器:

var app = angular.module('app', []);

app.controller('TextController', function ($scope) {
    //Controller Code Here    
});

app.controller('ItemController', function ($scope) {
    //Controller Code Here
});

如果出于某种原因,您希望将控制器放在单独的模块中,您仍然可以这样做,并将这些模块包含为主模块的依赖项:

var items = angular.module('items', []);
var text = angular.module('text', []);
var app = angular.module('app', ['items', 'text']);


text.controller('TextController', function ($scope) {
    //Controller Code Here
});

items.controller('ItemController', function ($scope) {
    //Controller Code Here
});

通常,您不需要为每个控制器配备一个模块。模块用于将相关的功能组合在一起,以便于在另一个应用程序中重新使用它。

以下是一些示例的链接:

单一模块:http://jsfiddle.net/36s7q/4/

多个模块:http://jsfiddle.net/36s7q/5/

请注意,在这两个示例中,页面上只有一个ng-app。

答案 1 :(得分:8)

看看这个,我改变了很多。 http://jsfiddle.net/36s7q/6/

页面上不需要两个app模块来实现两个控制器,你可以在同一个模块中拥有多个控制器。我还简化了语法。看一看。

var items = angular
.module('app1', [])
.controller('ItemController', function($scope) {
$scope.items = [ {
    title : 'Pencil',
    quantity : 8,
    price : 4.2
}, {
    title : 'Pen',
    quantity : 2,
    price : 5.2
}, {
    title : 'Watch',
    quantity : 3,
    price : 10.2
} ];
})
.controller('TextController', function($scope) {
$scope.text = {
    message : 'Welcome!!'
};
});

答案 2 :(得分:1)

我建议使用路由,而不是回答您的实际问题。

请注意:解决问题需要 。但是,您可能希望在将来的项目中了解它。

如果我说得对,那么您要做的就是为页面的特定部分使用不同的控制器/视图。

要实现此目的,请创建一个应用程序模块(请记住,Angular应用程序为SPA's)。然后,您可以定义一些路线并告诉Angular在需要其中一个时使用什么:

var app = angular.module('app', ['ngRoute']);
app.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/', {templateUrl: './partials/views/root.html',   controller: 'rootCtrl'}}).

        when('/section', {templateUrl: './partials/views/section.html',   controller: 'sectionCtrl'}}).

        otherwise({redirectTo: '/'});
}]);

进一步阅读:http://docs.angularjs.org/api/ngRoute

请注意,Angular的最新稳定版需要ngRoute模块才能使用routeProvider。

答案 3 :(得分:1)

以下是您有多个控制器的方法:

public static PrivateKey getPrivateKey(byte[]   encryptedPkcs8, String passwd) throws Exception{

        EncryptedPrivateKeyInfo encryptPKInfo = new EncryptedPrivateKeyInfo(encryptedPkcs8);

        Cipher cipher = Cipher.getInstance(encryptPKInfo.getAlgName());
        PBEKeySpec pbeKeySpec = new PBEKeySpec(passwd.toCharArray());
        SecretKeyFactory secFac = SecretKeyFactory.getInstance(encryptPKInfo.getAlgName());
        Key pbeKey = secFac.generateSecret(pbeKeySpec);
        AlgorithmParameters algParams = encryptPKInfo.getAlgParameters();
        cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams);
        KeySpec pkcs8KeySpec = encryptPKInfo.getKeySpec(cipher);
        KeyFactory kf = KeyFactory.getInstance(ALGORITHM);
        return kf.generatePrivate(pkcs8KeySpec);
}

我希望它有所帮助;)