AngularJS控制器构造函数和带参数的实例化

AngularJS控制器构造函数和带参数的实例化,angularjs,Angularjs,是否可以在AngularJS中实例化控制器,并像在OOP中一样将参数传递给其构造函数?我不知道如何重构3个相同的控制器,只需变量名称和内容发生变化 Thanx.您可以使用公共接口创建服务,然后通过依赖项注入将相应的服务传递给每个控制器。在我的代码中,这是表控制器的情况,其中唯一需要更改的是数据源: 想象一下,您有一些类似这样的代码 angular.module('myapp').controller('TableACtrl', ['$scope', function($scope) {

是否可以在AngularJS中实例化控制器,并像在OOP中一样将参数传递给其构造函数?我不知道如何重构3个相同的控制器,只需变量名称和内容发生变化


Thanx.

您可以使用公共接口创建服务,然后通过依赖项注入将相应的服务传递给每个控制器。在我的代码中,这是表控制器的情况,其中唯一需要更改的是数据源:

想象一下,您有一些类似这样的代码

angular.module('myapp').controller('TableACtrl', ['$scope', function($scope) {
    $scope.data = // get the data from some source
    $scope.someFunction = function () { ... };
    $scope.someOtherFunction = function () { ... };
}]);

angular.module('myapp').controller('TableBCtrl', ['$scope', function($scope) {
    $scope.data = // get the data from some other source
    $scope.someFunction = function () { ... };
    $scope.someOtherFunction = function () { ... };
}]);
它看起来像:

var tableCtrl = function($scope, dataSource) {
    $scope.data = dataSource.getData();
    $scope.someFunction = function () { ... };
    $scope.someOtherFunction = function () { ... };
};

angular.module('myapp')
    .controller('TableACtrl', ['$scope', 'dataSourceA', tableCtrl])
    .controller('TableBCtrl', ['$scope', 'dataSourceB', tableCtrl])

angular.module('myapp')
    .service('dataSourceA', function() {
       return {
           getData: function() { ... }
       };
    });
angular.module('myapp')
    .service('dataSourceB', function() {
       return {
           getData: function() { ... }
       };
    });

我仍然会把东西放在一个模块中,这样你就不会污染全局窗口。但是这是一个不同的问题。

如果页面上有3个不同的部分,它们的代码非常相似,听起来你应该考虑使用一个指令。即使您不需要直接控制DOM(这是使用指令的典型原因),并且只需要标准的角度数据绑定,这也是通过指令上设置的属性在不同上下文中重用控制器的好方法

您可以在以下位置看到一个正在工作的plunkr:

但关键是指令可以绑定到其父范围控制器中的变量。例如,在父范围中有3个变量,因此:

$scope.myVariable1 = 'Value 1';
$scope.myVariable2 = 'Value 2';
$scope.myVariable3 = 'Value 3';
然后,您可以在模板中设置指令的3个实例:

<my-directive my-param="myVariable1"></my-directive>
<my-directive my-param="myVariable2"></my-directive>
<my-directive my-param="myVariable3"></my-directive>
“=”表示在指令范围内有一个名为“myParam”的变量,该变量等于(+绑定到)指令上“my param”属性指定的变量。因此,在指令的模板上,您可以使用:

<div>Value of parameter: {{myParam}}</div>

然后应该能够根据该实例的myParam自定义其行为。

您可以使用
.value(“valueId”,someValue)
并使用
函数($scope,…,valueId)将其注入控制器
将3个控制器重构为一个服务,并将服务注入到每个控制器中。你真的应该为此使用angular服务,而不是使用全局变量。@MichaelTempest你在说什么?你读过我写的东西吗?你说的和我说的完全一样。是的,你正在输入一个全局变量函数,你正在注入每个控制器。这是个坏习惯。应使用角度服务。您并不是在创建一个service@MichaelTempest这将创建三个控制器,注入的唯一内容是$scope服务和数据源服务。关键是,他可以通过一个公共接口创建不同的数据源服务,并通过注册它们来创建新的控制器。问题是,您仍然在使用一个全局变量,在您的情况下,数据源应该写入一个服务,即angular.factory,那么控制器应该只查看angular服务。不仅仅是一个全局函数
<div>Value of parameter: {{myParam}}</div>
$scope.myParam