AngularJS种子:将JavaScript放入单独的文件中(app.js,controllers.js,directives.js,filters.js,services.js)

Chr*_*evo 93 javascript dependency-injection angularjs

我正在使用angular-seed模板来构建我的应用程序.最初我将所有JavaScript代码放入一个文件中main.js.该文件包含我的模块声明,控制器,指令,过滤器和服务.应用程序工作正常,但我担心可扩展性和可维护性,因为我的应用程序变得更加复杂.我注意到,角种子模板对每一种单独的文件,所以我尝试从单一的发布我的代码main.js文件到每个标题中的这个问题提到的其他文件,并在找到app/js的目录角- 种子模板.

我的问题是:如何管理依赖项以使应用程序工作?这里找到的现有文档在这方面不是很清楚,因为给出的每个示例都显示了一个JavaScript源文件.

我的一个例子是:

app.js

angular.module('myApp', 
    ['myApp.filters',
     'myApp.services',
     'myApp.controllers']);
Run Code Online (Sandbox Code Playgroud)

controllers.js

angular.module('myApp.controllers', []).
    controller('AppCtrl', [function ($scope, $http, $filter, MyService) {

        $scope.myService = MyService; // found in services.js

        // other functions...
    }
]);
Run Code Online (Sandbox Code Playgroud)

filters.js

angular.module('myApp.filters', []).
    filter('myFilter', [function (MyService) {
        return function(value) {
            if (MyService.data) { // test to ensure service is loaded
                for (var i = 0; i < MyService.data.length; i++) {
                    // code to return appropriate value from MyService
                }
            }
        }
    }]
);
Run Code Online (Sandbox Code Playgroud)

services.js

angular.module('myApp.services', []).
    factory('MyService', function($http) {
        var MyService = {};
        $http.get('resources/data.json').success(function(response) {
            MyService.data = response;
        });
        return MyService;
    }
);
Run Code Online (Sandbox Code Playgroud)

main.js

/* This is the single file I want to separate into the others */
var myApp = angular.module('myApp'), []);

myApp.factory('MyService', function($http) {
    // same code as in services.js
}

myApp.filter('myFilter', function(MyService) {
    // same code as in filters.js
}

function AppCtrl ($scope, $http, $filter, MyService) {
    // same code as in app.js
}
Run Code Online (Sandbox Code Playgroud)

如何管理依赖项?

提前致谢.

Jus*_* L. 108

问题是由于您在所有单独的文件中"重新声明"应用程序模块而导致的.

这就是app模块声明(不确定声明是正确的术语)的样子:

angular.module('myApp', []).controller( //...
Run Code Online (Sandbox Code Playgroud)

这就是你的应用程序模块的赋值(不确定赋值是否正确):

angular.module('myApp').controller( //...
Run Code Online (Sandbox Code Playgroud)

注意缺少方括号.

所以,前一个版本,一个方括号,只能使用一次,通常在你的app.jsmain.js.所有其他相关文件 - 控制器,指令,过滤器 ...... - 应使用后一版本,即没有方括号的版本.

我希望这是有道理的.干杯!

  • 我找到了解决这个问题的方法.看来只需要一个模块`myApp`.在我的app.js文件中,我为它创建了一个var`var myApp = angular.module('myApp',[]);`在所有其他文件中我只是引用了这个var(例如,`myApp.filter('myFilter) ',function(MyService){/*filter code*/});`只要我在html中的脚本标签中添加了文件名,我就不需要声明任何其他依赖项.角度种子项目模板是在这方面相当混乱. (9认同)
  • 导致错误是因为Angular正在寻找名为myApp.controller,myApp.filters的模块......但是,这些模块不是模块,它们是扩展名为myApp的模块的组件.如果从模块依赖项中删除所有myApp,那么一切都应该有效.在声明主app模块时,只需保持方括号为空(除非你包括其他真正的角度模块,例如`ngCookies`,`ngResource`):`angular.module('myApp',[]);` (5认同)
  • 我保证你的作品.我每天都在使用它来开发Angular Apps.同样,我在主js文件中有一个`angular.module('myApp',[])声明;`(注意方括号).然后,所有其他文件通过使用`angular.module('myApp').controller`或`.directive`语法来引用该模块. (4认同)

Geo*_*ker 11

如果您想将应用程序的不同部分(filters, services, controllers)放在不同的物理文件中,那么您需要做两件事:

  1. 在您app.js或每个文件中声明这些名称空间(缺少更好的术语);
  2. 请参阅每个文件中的这些命名空间.

所以,你app.js会看起来像这样:

angular.module('myApp', ['external-dependency-1', 'myApp.services', 'myApp.controllers'])
.run(function() {
   //...

})
.config(function() {
  //...
});
Run Code Online (Sandbox Code Playgroud)

并在每个单独的文件中:

services.js

angular.module('myApp.services', []); //instantiates
angular.module('myApp.services') //gets
.factory('MyService', function() { 
  return {};
});
Run Code Online (Sandbox Code Playgroud)

controllers.js

angular.module('myApp.controllers', []); //instantiates
angular.module('myApp.controllers')      //gets
.controller('MyCtrl', function($scope) {
  //snip...
})
.controller('AccountCtrl', function($scope) {
  //snip...
});
Run Code Online (Sandbox Code Playgroud)

所有这些都可以组合成一个电话:

controllers.js
angular.module('myApp.controllers', []) 
.controller('MyCtrl', function($scope) {
 //snip...
});    
Run Code Online (Sandbox Code Playgroud)

重要的是你不应该重新定义angular.module('myApp'); 当你实例化你的控制器时,这会导致它被覆盖,可能不是你想要的.