Nano Hash - криптовалюты, майнинг, программирование

Адаптивная верстка (мобильная/десктопная) в AngularJS — как лучше это сделать (пример внутри)

Каков предпочтительный способ обработки адаптивного (а не адаптивного) макета в AngularJS? Что мне нужно сделать, так это иметь другой макет с разными общими компонентами (общие директивы и контроллеры) для настольных компьютеров и мобильных устройств. Я думал об использовании ui-router, вот что у меня сейчас:

index.html (основной файл):

<!DOCTYPE html>
<html>

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="[email protected]" src="https://code.angularjs.org/1.4.1/angular.js" data-semver="1.4.1"></script>
    <script data-require="[email protected]" data-semver="0.2.15" src="//rawgit.com/angular-ui/ui-router/0.2.15/release/angular-ui-router.js"></script>
    <script src="app.js"></script>
  </head>

  <body data-ng-app="plunker" data-ng-strict-di>
    <header>
    <nav>
      <ul>
        <li><a data-ui-sref="mobile.user">Mobile</a></li>
        <li><a data-ui-sref="desktop.user">Desktop</a></li>
      </ul>
    </nav>
    </header>
    <main data-ui-view>
    </main>
  </body>

</html>

desktop.html (оболочка для содержимого рабочего стола):

<h1>Desktop</h1>
<div data-ui-view>
</div>

mobile.html (обертка для мобильного контента):

<h1>Mobile</h1>
<div data-ui-view>
</div>

user.html (общий контент):

<div data-ng-controller="UserCtrl">
User name: {{name}}
</div>

app.js

var app = angular.module('plunker', ['ui.router']);

app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
  $stateProvider
    .state('mobile', {
      abstract: true,
      url: '/mobile',
      templateUrl: 'mobile.html'
    })
    .state('mobile.user', {
      url: '/user',
      templateUrl: 'user.html'
    })   
    .state('desktop', {
      abstract: true,
      url: '/desktop',
      templateUrl: 'desktop.html'
    })
    .state('desktop.user', {
      url: '/user',
      templateUrl: 'user.html'
    })
}]);

app.controller('UserCtrl', ['$scope', function($scope) {
  $scope.name = 'John';
}]);

Предварительный просмотр и редактирование:

http://plnkr.co/edit/gRnTJkMa7hTLnffOERMT?p=preview

  1. Является ли это предпочтительным способом создания адаптивной верстки?
  2. Как я могу (с таким подходом):

    1. Add a class to in index.html based on mobile/desktop choice
    2. Динамически загружать mobile.css или desktop.css

С уважением,


Ответы:


1

Недавно я столкнулся с теми же проблемами, поэтому я приземлился здесь в поисках ответов. Согласно моим выводам, похоже, у меня есть два разных варианта:

  1. Используйте свой подход

Факты

  • Два частично разных макета, потому что верхний и нижний колонтитулы, а также некоторые другие теги основного текста по-прежнему являются общими. В противном случае вам придется применить data-ui-view к html
  • Этого можно достичь, только если вы используете ui-router, это не работает с угловым маршрутизатором по умолчанию.
  • Вы будете загружать все маршруты и конфигурации, как с рабочего стола, так и с мобильного, потому что у вас есть общий файл конфигурации. Это означает, что вам нужно каким-то образом загрузить все файлы js, даже если пользователь посещает только мобильную версию. В противном случае вам придется создать новый файл конфигурации для мобильной версии и использовать его для мобильного макета или динамически исключить какой-либо маршрут на основе обнаруженного устройства.
  • Вы сможете переключаться с мобильного на настольный компьютер в своем одностраничном приложении без перезагрузки. Не уверен, преимущество это или нет.

Хорошие части:

Вы не собираетесь применять какую-либо серверную логику и не собираетесь отделять основной файл index.html от сервера. Это означает, что вся логика лежит на стороне клиента.

Плохие части:

Вы усложняете логику, потому что вам нужно сделать четкое разделение между устройствами и по возможности избегать загрузки неиспользуемых файлов js. Если вы делаете это, по сути, вы делаете другой SPA, потому что настольная версия не будет доступна в вашем SPA.

  1. Поделитесь одним и тем же приложением, но с сервера на основе домена вы можете использовать другой HTML-файл. Например: yoursite.com будет обслуживать index.html, который в конечном итоге загрузит настольную версию, а m.yourside.com будет обслуживать mobile.html, который в конечном итоге загрузит мобильную версию.

Факты:

  • Это больше похоже на жесткое разделение и подразумевает логику сервера для разделения
  • При переключении с мобильного и рабочего стола произойдет перезагрузка.
  • Теперь вы не можете использовать ту же конфигурацию или другие изменения из app.js, которые относятся к вашей настольной версии, поэтому может потребоваться изменить некоторые файлы, чтобы они больше не ссылались на библиотеки, используемые для настольных компьютеров.
  • Этот подход больше похож на новое приложение angularJs в том же проекте (структура папок/папка приложения), возможно, с тем же именем и множеством общих компонентов и служб, но с меньшим количеством зависимостей и более чистым.

Для меня это больше похоже на логическое разделение, учитывая, что вам не нужно серверировать все эти файлы js в вашей мобильной версии, возможно, вы не будете использовать все функции настольной версии для мобильной версии. Единственная разница, которую я вижу здесь на уровне презентации, может быть, другая маршрутизация, файл конфигурации, контроллеры и представления. Все те же модели и общие сервисы и большие компоненты.

Чтобы принять решение, вам нужно обдумать обе ситуации, каждая из которых имеет хорошие и плохие стороны. Сейчас я еще не знаю, какое решение принять, я буду исследовать, может быть, день или два.

Добрый день и удачи.

Андрей

14.10.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..