2013-09-30 4 views
1

Я пытаюсь разделить и организовать приложение AngularJS, так что это не только файл main.js 5000. Отключение директив и т. Д. И использование 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 внутри, чтобы поговорить с серверным сервером (дерево слишком сложное, чтобы одновременно храниться в памяти, а также оно изменяется).

Для того, чтобы использовать простой инструмент, основанный на кошке, для создания моего окончательного кода, я хочу переместить 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-иш. Может ли кто-нибудь предложить «правильный» способ сделать такие вещи?

+4

Рассмотрите возможность использования NavTree. –

+0

Как сказал @kju, создайте услугу и закачайте службу в нужные контроллеры. Внутри вашего сервиса сделайте вызов '$ http' и передайте обещание контроллеру. – tymeJV

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

     ... 

    } 

}); 

Спасибо за щупами в правильном направлении!

Смежные вопросы