-
Notifications
You must be signed in to change notification settings - Fork 178
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Сложности с пониманием документации #23
Comments
Первая сложность http://www.angular.ru/api/ngResource.$resource В общем, все понятно, но тонкости не ясны. К примеру, не ясно что такое «класс» действия. Это тип действия GET, POST, PUT и т.д. или это про внутренний ангуляровский объект действия. Строчка, переведенная как «Методы действий объекта класса или экземпляра объекта могут быть вызваны со следующими параметрами:» громоздка и непонятна. Что хотели сказать в оригинале? Так же в описании: |
Если это про секцию 'Return':
то как мне кажется, они хотели сказать что объект
|
Это они так Active Records описали :-)) Предполагаю, что слово класс взяли в кавычки, потому что в яваскрипте чистых классов нет... А может и вовсе потому, что у нас тут фабрика, а не класс. А конструктор это набор фабричных методов. И судя по всему, объект ресурса и объект ресурсного класса это одно и то же, назвал это ресурсным объектом, а сами данные ресурсом. Остается разъяснить ситуацию с префиксом $. Что он делает? И почему у них такой странный набор методов по умолчанию. Есть псевдоним для удаления, но нет создания. Или save это создание, а где тогда update? Странная логика. Перевел весь кусок так: $resource — это фабрика, создающая ресурсный объект, позволяющий взаимодействовать с RESTful сервером. Возвращаемый объект описывает действия и методы, предоставляющие высокоуровневый доступ без необходимости взаимодействия с низкоуровневым сервисом $http. Возвращает {Object} – ресурсный объект, содержащий действия, которым сопоставлены HTTP-методы. По умолчанию содержит следующие: { 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'} }; Вызов этих методов вызывает ng.$http с соответствующим HTTP-методом, адресом и параметрами. Когда от сервера приходят данные, создается экземпляр ресурса. Действия save, remove и delete можно использовать так же с префиксом $. Это позволяет легко выполнять CRUD операции (создание, чтение, обновление, удаление) на серверных данных, как показано здесь: var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
}); Важно, что сразу после вызова метода объекта $resource, возвращается ссылка на пустой ресурс (объект или массив в зависимости от isArray). Когда данные придут от сервера, существующая ссылка будет ссылаться на фактические данные. Это полезный трюк, т. к. обычно ресурсы используются в моделях, на основе которых рисуется вид. Пока ресурс пустой, он не показывается в виде, но как только приходят данные, вид перерисовывается, чтобы отобразить полученное. Поэтому в большинстве случаев не нужно писать колбэк для методов в действиях. Методы в действиях ресурсного объекта или его экземпляра могут принимать следующие параметры: HTTP GET: ресурсный_объект.действие([parameters], [success], [error]) |
Вопрос о $ и действиях по умолчанию остается открытым, а пока следующая тема. Прочитал на хабре комментарий:
Действительно распространенная проблема? Если так, то стоит написать совет в разделе о записи примеров. |
Про Resource: Есть функция Да в JavaScript-е нет понятия |
Создание это |
По поводу комментария на хабре: Да есть такая проблема, но она описана в документации. |
В конструкторе что-то типа такого содержится: var $save = this.save, зачем только префикс вводить непонятно. И любой из этих методов сохраняет-добавляет/удаляет свойства из this. Но все равно получается односторонняя связь: данные на сервере синхронизируются с клиентом, но клиент отследить обновление сервера никак не может, т.к. нет метода $get и чтобы получить что-либо, нужно создать новый экземпляр ресурса. Или я неправильно CRUD понимаю :-) Тогда лучше переименовать ресурсный объект в конструктор ресурса Про минификацию. Проглядел, действительно есть. Тогда стоит вынести пожелание все примеры описывать в стиле |
Не мне кажется для примера это не важно, если только пример не про минификацию :) Зачем пример перегружать не нужной конструкцией, примеры нужны что бы подчеркнуть конкретную особенность которую они описывают. :) |
В прототипе конструктора Resource содержится: Resource.prototype['$' + action] = Resource[action]; У экземпляров есть только методы с префиксом '$'. ✌️ :) |
Да я вот не уверен, сильно ли это перегружает примеры) Сложность почти одна и та же. Более того во всех примерах отдельными функциями только контроллеры записывают. Сервисы, фильтры и т.п. так же через myModule.service/filter/directive. А если пристыковывать контроллер сразу к объявлению метода (а не через переменную), то еще короче получается. Вот и думаю, зачем, вообще, разработчики ввели первую запись :-) |
Первая запись тебе позволяет не заботится о порядке в котором перечислены зависимости. // зависит от порядка
angular.module('app').controller('SomeCtrl', ['$scope', '$http', function ($http, $scope) { ... // Wrong!
// не зависит от порядка
function A($scope, $http) { ... }
function B($http,$scope) {...} |
Ух... Ну если народ разленится следить за порядком, то потом-то они точно не сообразят. Других преимуществ нет? |
Такой подход хорош для примеров :) |
Ладно, убедил :-) Напишу только о возможных проблемах, чтобы знали когда примеры передирают |
Не совсем ясен код: angular.module('myMod',[]).value('myVal',{}).directive('myDir',['myVal', function(myVal) {...}]) Не мог нигде найти, что это за запись директивы такая |
Да, это внедрение зависимости с помощью нотации массива. |
А почему myVal нельзя просто объявить в директиве через var? И что это за зависимость такая от константы? Т.е. получается, что myVal в коде предполагает ссылку на другой модуль? Пример взял отсюда: https://github.com/angular-ui/ui-sortable/blob/master/src/sortable.js, если что) |
Чтобы сделать глобальную константу, объявить её в одном месте, а использовать в нескольких местах. |
А как быть с зависимостями? Странно, что в примере зависимость от глобальной константы, да еще пустой. Какой смысл? Если смысл есть, нужно о нем в документации рассказать, а то сейчас на недокументированную особенность похоже |
В этом и есть основной смысл внедрения зависимостей. |
В этом примере, они без value обходятся, но используют зависимость от директивы анимации https://github.com/angular-ui/bootstrap/blob/master/src/collapse/collapse.js. Но у второго плагина и настроек нет. Подытожив, смысл value() такой же как у объекта default в jQuery-UI и bootstrap плагинах: Переопределение настроек по умолчанию. Типа, чтобы все попапы на странице всегда слева выползали. Не знаю ни одного случая, когда кто-нибудь эти настройки переопределял, но раз все делают, наверное, такие случаи случаются :-) |
Иногда встречаются моменты, которые сложно понять и, соответственно, перевести. Наверное, не стоит по поводу них создавать отдельные темы и пока можно всё собирать здесь.
The text was updated successfully, but these errors were encountered: