Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 代码组织AngularJS巨型控制器_Javascript_Angularjs_Code Organization - Fatal编程技术网

Javascript 代码组织AngularJS巨型控制器

Javascript 代码组织AngularJS巨型控制器,javascript,angularjs,code-organization,Javascript,Angularjs,Code Organization,我有一个巨大的控制器,我把它分为多个子系统,我根据它们的功能将其放入其他文件中 一切正常,但我需要一个建议和我的问题的答案: 我做对了吗 这是一个巨大的控制器: function controller($scope, $http) { //code someFunction($scope, boolA, function1, function2); //code } function someFunction($scope, boolA, function1, function2

我有一个巨大的控制器,我把它分为多个子系统,我根据它们的功能将其放入其他文件中

一切正常,但我需要一个建议和我的问题的答案: 我做对了吗

这是一个巨大的控制器:

function controller($scope, $http) { 
  //code
  someFunction($scope, boolA, function1, function2);
  //code
}
function someFunction($scope, boolA, function1, function2) {
  //code where I use all the parametrs of function
  function someFunctionSubcontoller() {
    //here is used another function from other subcontroller
  }
}
以下是我的分包商在其他文件中的代码,我在前控制器后加载:

function controller($scope, $http) { 
  //code
  someFunction($scope, boolA, function1, function2);
  //code
}
function someFunction($scope, boolA, function1, function2) {
  //code where I use all the parametrs of function
  function someFunctionSubcontoller() {
    //here is used another function from other subcontroller
  }
}
可以将函数作为参数发送吗?因为$scope监视所有东西,所以我不从转包商处退货可以吗?我是否可以在另一个控制器中使用一些控制器功能

现在我看到不好不正确,但我需要拆分主控器,因为其中有超过10k行代码


谢谢你的建议和帮助

我建议您在编写代码时使用angular.module()。我将以良好的模块化方式分离您的代码

您可以创建一个子控制器,并使用
$controller
依赖项将其注入主控制器中

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

app.controller('subCtrl', function(){
   $scope.test3 = function(){
     //code
   };
   $scope.test4 = function(){
     //code
   };
});

app.controller('ParentCtrl', function($scope, $controller){
   //injecting subCtrl scope inside ParentCtrl
   $controller('subCtrl', {$scope: $scope});
   //after this line method and $scope variables of subCtrl will be available.
   $scope.test = function(){
     //code
   };
   $scope.test2 = function($scope){
     //code
   };
});

一个拥有10000行代码的控制器尖叫着说你在多次破坏代码

<>而不是做“子控制器”,您应该首先考虑重构代码并将可重用代码段移动到服务中。然后,在UI中寻找可以转换为指令的通用组件,并使用隔离作用域将一些逻辑移动到这些指令的控制器中。您会发现,当这些元素对自己负责时,控制和测试这些元素要容易得多

接下来,研究使用“”语法,它允许您打破与
$scope
的联系。使用
$scope
非常困难,因为很难确定直接放置在
$scope
上的项目的来源、使用和修改位置。很容易发现一个对象的值与您想要的值不同,因为它是在其他地方修改的。从:

•当多个控制器应用于一个元素时,使用控制器as可以清楚地显示您在模板中访问的控制器

•如果将控制器编写为类,则可以更轻松地从控制器代码内部访问属性和方法,这些属性和方法将显示在作用域上

•因为绑定中总是有一个
,所以您不必担心原型继承掩蔽原语


总之,您可能会发现,如果您重构代码而不是仅仅“分解代码”,您将得到一个更易于管理、可测试和可靠的解决方案。

您应该重新组织代码并提供服务,而不是像您所说的那样进行分包。这可能比您所期望的更多信息,但是,如果您想要一种模式更好地组织您的代码,请查看DCI:“使用$scope是一种反模式”这句话是什么意思?@Richard我尽力在这里解释,一年后我仍然坚持这一点。添加了“控制器作为”语法作为一种机制,将控制器直接别名到UI,而不是在
$scope
上使用“半全局”对象。大多数较新的文档都不鼓励使用
$scope
,并且
$scope
已从angular 2.0中完全删除
$scope
在小型项目/样板中很方便,但在大型项目中不可持续。