我正在尝试拆分并组织一个AngularJS应用程序,这样它不仅仅是一个5000行的main.js文件。拆分指令等,并使用make
来构建工作代码就可以了。但是,我的控制器有几个中等复杂的内部类。这些过去大致定义如下(为清楚起见,只显示了一个):
var app = angular.module("infrasense", []);
app.controller("AppMain", function($scope, $http, $timeout) {
function NavTree(dbMain, dbTimeout, allTagTypes, allAttTypes) {
...
}
NavTree.prototype = {
...
}
...
$scope.navTree[0] = new NavTree(dbMain, dbTimeout);
...
});
NavTree类(包含数据记录应用程序中的站点和资产的分层树)使用指令呈现,并在内部使用$ http与后端服务器通信(树太复杂,无法保存在内存中)一次,加上它改变了。)
为了继续使用简单的(基于cat)工具生成我的最终代码,我想将NavTree移出控制器。我目前通过从控制器内部传递$ http来实现这一点:
function NavTree($http, dbMain, dbTimeout, allTagTypes, allAttTypes) {
...
this.$http = $http;
...
}
app.controller("AppMain", function($scope, $http, $timeout) {
...
$scope.navTree[0] = new NavTree($http, dbMain, dbTimeout);
...
});
这有效,但感觉不优雅,非AngularJS-ish。任何人都可以建议采用“正确”的方式来做这类事情吗?
答案 0 :(得分:0)
成功!我现在是将这些不优雅的内部类从main.js转移到它们所属的服务中的一个很好的比例。
我在阅读文档时遗漏但在“I Wish I Knew Then What I Know Now — Life With AngularJS”中重述的关键实现是服务只是依赖注入的单例。
我的服务定义如下(其中“Popup”是另一个管理错误消息弹出窗口的服务):
app.factory("ThingTree", function (Popup, $q, $http) {
// Database information. This is set up by the "init" function.
// (There's only one DB, and this way I only have to pass its
// connection info once.)
var dbMain = "";
var dbTimeout = 0;
...
// Each level of the tree is an array of these tree objects.
function TreeNode() {}
TreeNode.prototype = {
open: function() { ... }
...
};
return {
// Initialise the database connection.
init: function(myDbMain, myDbTimeout) {
dbMain = myDbMain;
dbTimeout = myDbTimeout;
...
},
// Create a tree and return the root node.
create: function() { ... },
...
}
});
感谢正确方向的刺激!