splincodewd
@splincodewd
Developer

Правильно ли я инициализирую приложение на AngularJS 1.5?

Я только учусь, и создал приложение на angular

У меня есть файл app.js, который подключается к index.html, я его создал таким:
'use strict';

import './vendor/materialize.js';
import HttpApi from './vendor/http/http.js';
import ngInject from './angular/inject.js'; 

/*
=======================================
ИНИЦИАЛИЗАЦИЯ данных
=======================================
*/

window.jQueryNamespacePlugin = require('./jquery/jQueryInitPlugin.js');
window.$plugin = jQueryNamespacePlugin;
const inject = ['$rootScope', '$http', '$compile'];

// реестр данных приложения
window.$Registry = { 

    // авторизация пользователя
    'login': false,

    // объект для работы с API бэкэнда
    'server': null,

    // счетчик изменений за один такт (в единицу времени)
    'globalCounter': 0

};

/**
 * Функция добавляющая общие данные в контроллере компонента
 * @param {object} Registry - реестр данных приложения
 * @param {object} $compile - объект для добавления нового DOM и связывания с обработчиками
 * @param {object} $scope - локальная область видимости шаблонов относительно компонента контроллера
 * @param {object} dataService - сервис, обменивающийся данными между контроллерами
 */
window.mixinsRegistry = (Registry, $compile, $scope, dataService) => {

  return ($.extend(Registry, {

    // область видимости контроллера
    '$scope': $scope, 

    // функция привязки $scope
    '$compile': $compile, 

    // данные синхронизированные между контроллерами
    'dataService': dataService

  }));

}

/**
 * Функция, выполняющаяся в первую очередь при document.ready
 * @borrows $Registry, $plugin
 * @param {object} $rootScope - общая область видимости шаблонов для приложения 
 * @param {object} $http - ajax-объект для работы с http-запросами
 * @param {object} $compile - объект для добавления нового DOM и связывания с обработчиками
 */
const runApp = ($rootScope, $http, $compile) => {

    $rootScope.loginIsTrue = $Registry.login;

    // cсылка на ajax взаимодействие
    window.server = new HttpApi("api/", $http, $Registry); 

   	// запрос на проверку статуса авторизации
    server.send({'state_get': []}).then((data) => {

    	if (data.IsSuccessful && localStorage.getItem("SecurityToken")) {

        $rootScope.loginIsTrue = $Registry.login = true;
        $('[ng-view]').after($compile(
            `<main-content></main-content>`
        )($rootScope));

      } else {

        $('[ng-view]').after($compile(
            `<login-content></login-content>`
        )($rootScope));
          
      }

    });

};

const app = angular.module("myApp", []).run(((runApp, inject)=>{
    ngInject(runApp, inject); return runApp;
})(runApp, inject));

/*
=======================================
ИНИЦИАЛИЗАЦИЯ КОМПОНЕНТОВ
=======================================
*/


import loginComponent from './angular/components/loginContent.js';
import navComponent from './angular/components/navContent.js';
import mainComponent from './angular/components/mainContent.js';
import pagComponent from './angular/components/pagContent.js';
import widgetsComponent from './angular/components/widgetsContent.js';

app.component('loginContent', loginComponent)
   .component('mainContent', mainComponent)
   .component('navigation', navComponent)
   .component('pagination', pagComponent)
   .component('widgets', widgetsComponent);


/*
=======================================
ИНИЦИАЛИЗАЦИЯ ДИРЕКТИВ 
=======================================
*/

// вызываем jQuery плагины для определенных компонентов
import fadeInBody from './jquery/directives/fadeInBody.js';
import sideNavInitMaterialize from './jquery/directives/sideNavInitMaterialize.js';
import showAllTypesMenu from './jquery/directives/showAllTypesMenu.js';
import initMinHeightMainWrap from './jquery/directives/initMinHeightMainWrap.js';
import slidePaginationInitNew from './jquery/directives/slidePaginationInitNew.js';
import switchOff from './jquery/directives/switchOff.js';
import collapsibleInit from './jquery/directives/collapsibleInit.js';

app.directive('fadebody', fadeInBody)
   .directive('sidenav', sideNavInitMaterialize)
   .directive('showalltypesmenu', showAllTypesMenu)
   .directive('initminheight', initMinHeightMainWrap)
   .directive('initpagination', slidePaginationInitNew)
   .directive('switchoff', switchOff)
   .directive('collapsibleinit', collapsibleInit)


/*
=======================================
ИНИЦИАЛИЗАЦИЯ СЕРВИСА (связь между контроллерами)
=======================================
*/

import dataService from './angular/services/dataServiceClass.js';
app.service('dataService', ngInject(dataService, inject, '$timeout'));


/*
=======================================
ИНИЦИАЛИЗАЦИЯ КОНТРОЛЛЕРОВ
=======================================
*/

import LoginController from './angular/controllers/LoginController.js';
import NavController from './angular/controllers/NavController.js';
import MainController from './angular/controllers/MainController.js';
import PaginationController from './angular/controllers/PaginationController.js';
    
const setInject = (typeController) => ngInject(typeController, inject, ['$scope', 'dataService']);
app.controller('LoginController', setInject(LoginController))
   .controller('NavController', setInject(NavController))
   .controller('MainController', setInject(MainController))
   .controller('PaginationController', setInject(PaginationController));


/*
=======================================
Функция для вывода пагинации
=======================================
*/


app.filter('range', function() {
  return function(input, total) {
    total = parseInt(total);

    for (var i=0; i<total; i++) {
      input.push(i);
    }

    return input;
  };
});

/*
=======================================
ФУНКЦИОНАЛЬНЫЕ МОДУЛИ
=======================================
*/

const pathToModules = './angular/modules';

window.userprocesssteps      = require(`${pathToModules}/userprocesssteps.js`); // получение шагов на исполнение
window.myprocessesget        = require(`${pathToModules}/myprocessesget.js`); // получение моих процессов
window.processtypes          = require(`${pathToModules}/processtypes.js`); // получение услуг
window.myprocessessstep      = require(`${pathToModules}/myprocessessstep.js`); // получение выполненных шагов
window.myprocessesgetarchive = require(`${pathToModules}/myprocessesgetarchive.js`); // получение выполненных шагов


Нормально ли писать такой код?
  • Вопрос задан
  • 435 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Признаки плохого дизайна:

- Использование глобальных переменных (у вас же есть контейнер зависимостей)
- Вы почти везде инжектите инджектор. Это означает что вы часто полагаетесь на serviceLocator и это является плохой практикой. Это делает зависимости в коде менее явными.
- кастомные компоненты должны иметь какой-то префикс (по спецификации w3c) как минимум что бы отличать какой компонент откуда. То есть вместо loginContent лучше назвать это дело myLoginForm или что-нибудь описывающее что это за контрол. Это все же компонент а не "контент".
- Использование jquery. Он вам не нужен. выставите нужный стэйт и ангуляр сам обновит DOM.
- кривой хэндлинг аутентификации. Используйте интерцепторы и ждите 401-ой ошибки. Остальные ошибки не должны бросать на логин. Ну может у вас бэкэнд кривой тогда ладно.
- mixinsRegistry - какая-то сатана. Не делайте так. Делайте все явно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы