在控制器外使用$ http?

时间:2013-09-30 21:07:39

标签: javascript angularjs

我正在尝试拆分并组织一个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。任何人都可以建议采用“正确”的方式来做这类事情吗?

1 个答案:

答案 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() { ... },

        ...

    }

});

感谢正确方向的刺激!