Я работаю с AngularJS для моего последнего проекта. В документации и руководствах все данные модели помещаются в область действия контроллера. Я понимаю, что это должно быть там, чтобы быть доступным для контроллера и, следовательно, в соответствующих представлениях.
Однако я не думаю, что модель должна быть реализована там. Это может быть сложно и иметь частные атрибуты, например. Кроме того, можно использовать его в другом контексте / приложении. Помещение всего в контроллер полностью нарушает схему MVC.
То же самое относится и к поведению любой модели. Если бы я использовал архитектуру DCI и отделил поведение от модели данных, мне пришлось бы вводить дополнительные объекты для хранения поведения. Это будет сделано путем введения ролей и контекстов.
DCI == Д ата С ollaboration я nteraction
Конечно, данные и поведение модели могут быть реализованы с помощью простых объектов JavaScript или любого шаблона «класса». Но каков будет AngularJS способ сделать это? Пользуетесь услугами?
Итак, все сводится к этому вопросу:
Как реализовать модели, отделенные от контроллера, следуя рекомендациям AngularJS?
источник
Ответы:
Вы должны использовать сервисы, если вы хотите что-то, что может использоваться несколькими контроллерами. Вот простой надуманный пример:
источник
В настоящее время я пробую этот шаблон, который, хотя и не DCI, обеспечивает классическое разделение службы / модели (со службами для общения с веб-службами (также называемыми моделью CRUD) и моделью, определяющей свойства и методы объекта).
Обратите внимание , что я только использовать этот шаблон , когда объектная модель нуждается в методах работы на своих собственных свойств, что я, вероятно , использовать везде (например, улучшенные геттер / сеттеры). Я не рекомендую делать это для каждой службы систематически.
РЕДАКТИРОВАТЬ: Раньше я думал, что этот шаблон будет идти против мантры «Угловая модель - это простой старый объект javascript», но теперь мне кажется, что этот шаблон идеально подходит.
РЕДАКТИРОВАТЬ (2): чтобы быть еще яснее, я использую класс Model только для разметки простых методов получения / установки (например: для использования в шаблонах представления). Для большой бизнес-логики я рекомендую использовать отдельные службы, которые «знают» о модели, но хранятся отдельно от них и включают только бизнес-логику. Назовите его сервисным уровнем «бизнес-эксперт», если хотите
service / ElementServices.js (обратите внимание, как элемент добавляется в декларации)
model / Element.js (с помощью angularjs Factory, созданной для создания объектов)
источник
Документация Angularjs четко гласит:
Так что это зависит от вас, как объявить модель. Это простой объект Javascript.
Лично я не буду использовать Angular Services, поскольку они должны были вести себя как одноэлементные объекты, которые вы можете использовать, например, для сохранения глобальных состояний в вашем приложении.
источник
DCI - это парадигма, и как таковой нет angularJS способа сделать это, либо язык поддерживает DCI, либо нет. JS довольно хорошо поддерживает DCI, если вы хотите использовать преобразование исходного кода, и с некоторыми недостатками, если вы этого не делаете. Опять же, DCI не имеет ничего общего с внедрением зависимостей, как, скажем, класс C # и определенно не является сервисом. Таким образом, лучший способ сделать DCI с angulusJS - это сделать DCI способом JS, который довольно близок к тому, как DCI формулируется в первую очередь. Если вы не выполните преобразование исходного кода, вы не сможете сделать это полностью, так как методы роли будут частью объекта даже вне контекста, но это, как правило, проблема с DCI на основе внедрения метода. Если вы посмотрите на fullOO.infoНа официальном сайте DCI вы можете взглянуть на реализации ruby, в которых также используется внедрение метода, или вы можете посмотреть здесь дополнительную информацию о DCI. Это в основном примеры RUby, но материал DCI не зависит от этого. Одним из ключей к DCI является то, что система делает отдельно от того, что система. Таким образом, объект данных довольно тупой, но однажды связанный с ролью в контекстной роли методы делают доступным определенное поведение. Роль - это просто идентификатор, не более того, при доступе к объекту через этот идентификатор доступны методы роли. Там нет роли объекта / класса. С внедрением метода область действия ролевых методов не совсем соответствует описанию, но близка. Примером контекста в JS может быть
источник
Эта статья о моделях в AngularJS может помочь:
http://joelhooks.com/blog/2013/04/24/modeling-data-and-state-in-your-angularjs-application/
источник
Как утверждают другие авторы, Angular не предоставляет готового базового класса для моделирования, но можно с пользой предоставить несколько функций:
Одна библиотека, которая хорошо выполняет все эти функции, - это ngActiveResource ( https://github.com/FacultyCreative/ngActiveResource ). Полное раскрытие - я написал эту библиотеку - и успешно использовал ее для создания нескольких приложений масштаба предприятия. Он хорошо протестирован и предоставляет API, который должен быть знаком разработчикам Rails.
Моя команда и я продолжаем активно развивать эту библиотеку, и я хотел бы видеть, как больше разработчиков Angular вносят в нее свой вклад и тестируют ее.
источник
ngActiveResource
и$resource
сервисом Angular . Я немного новичок в Angular и быстро просмотрел оба набора документов, но они, кажется, предлагают много общего. БылngActiveResource
разработан до того, как$resource
услуга будет доступна?Более старый вопрос, но я думаю, что тема более актуальна, чем когда-либо, учитывая новое направление Angular 2.0. Я бы сказал, что наилучшей практикой является написание кода с как можно меньшим количеством зависимостей от конкретной среды. Используйте только те части каркаса, которые добавляют прямую ценность.
В настоящее время кажется, что сервис Angular - это одна из немногих концепций, которая перейдет к следующему поколению Angular, поэтому, вероятно, разумно следовать общему руководству по переносу всей логики на сервисы. Тем не менее, я бы сказал, что вы можете создавать разъединенные модели даже без прямой зависимости от сервисов Angular. Создание автономных объектов только с необходимыми зависимостями и обязанностями - это, вероятно, путь. Это также значительно облегчает жизнь при автоматизированном тестировании. В наши дни единственная ответственность - это шумная работа, но она имеет большой смысл!
Вот пример скороговорки, которую я считаю хорошей для отделения объектной модели от DOM.
http://www.syntaxsuccess.com/viewarticle/548ebac8ecdac75c8a09d58e
Основная цель состоит в том, чтобы структурировать ваш код так, чтобы его было так же легко использовать в модульных тестах, как и в представлении. Если вы достигнете этого, вы сможете написать реалистичные и полезные тесты.
источник
Я попытался решить эту проблему в этом посте .
По сути, лучший дом для моделирования данных - это сервисы и фабрики. Однако, в зависимости от того, как вы извлекаете ваши данные, и от сложности поведения, которое вам необходимо, есть много разных способов реализации. Angular в настоящее время не имеет стандартного способа или наилучшей практики.
Пост охватывает три подхода, использующих $ http , $ resource и Restangular .
Вот пример кода для каждого из них с пользовательским
getResult()
методом в модели Job:Restangle (легкий горох):
$ ресурс (немного более замысловатый):
$ http (хардкор):
В самом посте блога более подробно рассматриваются причины, по которым вы можете использовать каждый из этих подходов, а также приведены примеры кода использования моделей в ваших контроллерах:
Модели данных AngularJS: $ http VS $ resource VS Ограниченный
Существует вероятность того, что Angular 2.0 предложит более надежное решение для моделирования данных, которое позволит всем на одной странице.
источник