Pull to refresh

Comments 38

Тогда можно и как Энгюлё транскрибировать :-) Ангуляр, потому что статья русская и понятие читателем хорошо знакомо, как и ява-скрипт и твиттер. Не перевожу только незнакомые понятия. А, вообще, тут такое дело, приживется так, как всюду публикуется. Сделайте сотню переводов без транскрипции, приживется оригинальное название.
UFO just landed and posted this here
А я не люблю, когда переводы пытаются учить произношению. В русских текстах по возможности должна использоваться кириллица.

Имена собственные объектом перевода не являются. Они являются объектом локализации.

Автору +500 за «Ангуляр» и «яваскрипт». «Restful» не является именем собственным, и посему перевод уместен.
Названия библиотек слова неудобные, но всегда можно что-то придумать. Не вижу проблем писать «ноде» и «андерскор».
А тот, кто сказал джитхаб, должен подучить матчасть на тему произношения слова git.
Не хотел бы я жить в мире, где аспирин, памперс, джип, лимонад и т. п. пишутся и произносятся как в оригинале. ХТМЛ и ПХП, кстати, отлично прижились, Гитхаб тоже, просто забыл его транскрибировать. В русском тексте любые слова подчиняются правилам русского языка и никак иначе, а то получается такое
Так же как «ява-скрипт» это Ваше «ангуляр» звучит корявенько, если до этого слышал в основном англоязычное произношение.

А я вот сейчас послушал по вашей ссылки и для меня английское звучит странненько. А вообще мы на русскоязычном ресурсе общаемся на русском. Чем меньше слов на других языках (не путать с заимствованными) тем проще общаться.
Документация <ваша-любимая-MV*-библиотека> отлично подходит для начала работы и ковыряния в API. Однако, она не объясняет как организовать и управлять приложением, когда оно разрастется до десятков или сотен тысяч строк кода.
Тогда можно и как Энгюлё транскрибировать :-) Ангуляр, потому что статья русская и понятие читателем хорошо знакомо, как и ява-скрипт и твиттер. Не перевожу только незнакомые понятия. А, вообще, тут такое дело, приживется так, как всюду публикуется. Сделайте сотню переводов без транскрипции, приживется оригинальное название.
В качестве эксперимента :-) Слишком часто встречающееся понятие, чтобы оставить как есть. Дайджест в русском имеет несколько другой смысл. Переваривание вполне подходит по смыслу. Думаю, после нескольких прочтений перестанет резать глаз.
Суть процесса описывается словом «сведение», как на мой взгляд. Но в общем попытка внести какой-то конкретный вариант термина редко удается.
Цикл сведения… Можно подумать. Попытка всегда удается, это дело времени. Почитайте, например, основы операционных систем. Там и семафоры и потоки и мьютексы. Дисциплина устоявшаяся, поэтому всем понятиям давно подобраны русские варианты.
«Переваривание»… цикл переваривания…

Смотря на Oxford Dicr(раз уж нужно переводить этот термин, мдя):
a compilation or summary of material or information

Digest cycle:
compilation of information |+ in cycle

Ух, ты, из доков:
Processes all of the watchers of the current scope and its children. Because a watcher's listener can change the model, the $digest() keeps calling the watchers until no more listeners are firing. This means that it is possible to get into an infinite loop. This function will throw 'Maximum iteration limit exceeded.' if the number of iterations exceeds 10.

Точно нет более вменяемого аналога?
Раз уж пост про Angular может кто-нибудь может посоветовать, что делать с моделями. После Backbone я в упор не могу понять, как организовать работу с реально-имеющимися моделями, я имею ввиду следующее: у меня есть данные, хранимые в LocalStorage, они некоотрым образом связаны, например, пользователи и совершенные платежи. В Backbone есть понятная сущность модель, есть коллекции, там же я реализую необходимые мне методы, используя плагин реализующий работу Backbone.sync с LocalStorage мои данные будут дегко и просто сохраняться и загружаться из него. Я могу подписаться на изменения модели, и перегенерировать некоторые другие сущности, например, список дней, когда были хоть какие-то платежи, для вывода в view.

В Angular, я не вижу ничего, на основе чего строить модели, я могу, конечно, в html написать у инпута, что ng-model='user.name', но как описать саму модель, реализовать её методы непонятно. Пока я так понял, как на Angular построить интерефейс, это действительно легко и просто, так же как и реализовать RESTfull для работы с backend'ом, но вопрос как построить толстые клиент с собственной логикой работы с коллекциями и моделями остается открытым.

Пока я так понимаю, это попросту должно быть реализовано другими средствами, но какими непонятно. В поисках коллекций нашелся плагин angular-collection, но это не решает проблем.
Если разберетесь, напи́шите топик?
Меня не покидает ощущение, что все должно быть как-то просто. Если же будет о чем написать, то обязательно напишу, правда я тут еще один топик задолжал, так что все наджеды на то, что летом будет время
Только вчера нашел сыроватый пример angulario.com/, там в демке что-то есть про куки, сессии и LocalStorage. Пока не разбирался.

Реализацию методов, думаю, можно подсмотреть в сервисе $resource, там каждый объект модели имеет в прототипе методы управления собой. Если правильно понял о чем речь.
Интересно, я думаю можно найти много интересного. Насчет LocalStorage надо посмотреть, что же все-таки делает плагин Offline Mode, так как написано что он сохраняет запросы когда нет сети, чтобы отправить позже, что не совсем тоже самое, что когда приложение в принципе может работать в офлайне, т.е реализована нужная логика, а бекенд нужен лишь для сохранения данных.

По вашему совету $resourse, кстати нагуглился плагин angularjs-webstorage-resource, он, конечно, сырой, но может прояснить некоторые моменты, как все-таки это дело организовать.
Вы хотите что-то типа такого? Или что-то другое?

'use strict';

angular.module('app.api.entities.user', ['app.api.rest.user'])

.factory('User', function($q, UserApi) {
    var cache = {};

    var initObject = function(data) {
        if (cache[data.id]) {
            angular.extend(cache[data.id], new User(data));
        } else {
            cache[data.id] = new User(data);
        }
        return cache[data.id];
    };

    var User = function(data) {
        angular.extend(this, data);
    };

    User.get = function(id){
        var apiResult = UserApi.get(id).then(function (test) {
            return initObject(test);
        });

        if (cache[id]) {
            return $q.when(cache[id]);
        } else {
            return apiResult;
        }
    };

    User.getAll = function(options){
        return UserApi.getAll(options).then(function(tests){
            return _.map(tests, function(test){ return initObject(test); });
        });
    };

    User.create = function(params){
        return UserApi.create(params);
    };

    User.prototype.remove = function(){
        return UserApi.remove(this.id);
    };

    return User;
});


Здесь в качестве примера сделано кэширование в памяти, если объект есть в кэше, он оттуда и отдается и делается фоновое обновление.
Естественно, кому что надо, тот то и делает, хоть localStorage, хоть что угодно. Ну и немного прослеживается структура приложения, точнее его части.

Полуживой пример: jsfiddle.net/u5gV2/
Спасибо! Ваш пример многое проясняет.
В целом решение очень похоже на то, что нужно, но как можно заметить, по сути вы описываете модель и все её методы с нуля, так же и API, а сверху добавляете лишь обертку от Angular, чтобы использовать далее. Или я чего-то не улавливаю и Angular как-то дополняет поведение созданных объектов?

Дальше, если я хочу подписаться на изменения в модели, то мне надо положить её в $scope и использовать $watch. Подписаться на изменнения коллекции или модели, я так понимаю непосредственно нельзя, или я ошибаюсь?
Я бы не назвал это оберткой. Хотя смотря что под этим подразумевать. Это сервис, который потом может инжектироваться в другие сущности AngularJS (контроллеры, другие сервисы, директивы, фильтры). Но инжектироваться будет вполне себе обычный объект javascript. Еще можно отметить, что сервисы в Angular — синглтоны.

Писать можно с нуля, можно использовать $resource, можно свою какую-нибудь project-специфичную фабрику сделать.

Про подписки — смотря зачем Вам надо подписываться. Подписаться, в принципе, можно и так:
$scope.$watch(function(){
    return SomeService.something
}, function(newVal, oldVal){
    
}, true);

Но в документации это, вроде, нормально освещено.
Этот раздел документации я видел, я про то, что это делается через $scope, а не через сам объект myObject.bind(...).

Получается, что как я и предлагал AngularJS не предлагает конкретных инструментов для описания моделей и коллекций, а предоставляет лишь инструмент для использования их в AngularJS-приложении. С одной стороны это плюс, так как моделью может являться все, что угодно, с другой стороны хорошее решение для M из MV* в отрыве от фреймворка не так просто не найти.

С $resource ситуация интересная, но если посмотреть на тот же angularjs-webstorage-resource видно, что это не то, чтобы путь предлагаемый фреймворком, в том плане, что не совсем гладко все проходит.

Спасибо вам, ситуация немного прояснилась, мне не так много надо, так что думаю этого всего хватит.
Этот раздел документации я видел, я про то, что это делается через $scope, а не через сам объект myObject.bind(...).

Ну да, там dirty checking (Conceptual Overview).

Получается, что как я и предлагал AngularJS не предлагает конкретных инструментов для описания моделей и коллекций

Я не очень понял, а зачем они Вам?

С $resource ситуация интересная

$resource я практически никогда и не использую (в текущих проектах тоже не используем). То, что я привел в качестве примера, конечно, напоминает базовый набор CRUD, но это в том числе потому, что я оттуда выпилил всю специфику проекта. А так там и API гораздо богаче и .get навороченнее и много чего еще всякого специфичного. Единственное, что я делал, условно говоря, на базе $resource — это похожую фабрику немного для других целей.
Я не очень понял, а зачем они Вам?

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

Кроме этого существуют отношения между моделями, я их реализовывал для backbone, но сколько можно=)
Один раз :) Нужную Вам фабрику, если такой нет готовой :) У всех своя специфика. Для большого проекта фабрика на сотню строчек кода — это пшик.
Лично я не считаю, что модели должны уметь себя сохранять и т. п. — это функция DAL, который должен вызываться из контроллера. Паттерны типа ActiveRecord пускай и удобны, но по сути это антипаттерны, нарушающие SRP. В общем бывает приятно, когда фреймворк позволяет не реализовывать антипаттерны руками, если уж решил их использовать, но он не должен быть под них заточен, чтобы их неиспользование не влекло усложнение кода. Грубо говоря, антипаттерны могут быть библиотекой в составе фреймворка, но не должны быть каркасом фреймворка (тавтология получилась, но так исторически сложилось, что большинство фреймворков по сути являются смесью pure фреймворков (каркасов) и библиотек).
Насколько я понимаю, dirty checking Angular'а позволяет Вам иметь в качестве моделей обычные JavaScript-объекты со свойствами и, возможно, с методами. То есть для реализации берется функция-конструктор, присваиваются свойства, на прототип навешиваются методы.

Angular понимает массивы и, по идее, массиво-подобные объекты — то есть Вы можете создать обычный Array, заполнить его своими объектами и отдать Angular'у в качестве модели коллекции.

Только начал разбираться с Angular. Поправьте, если ошибаюсь.
Нет, похоже что все верно. Просто как я писал уже выше, от модели в большинстве случаев требуется достаточно стандартное поведение, которое, конечно же, я ожидаю, что можно расширить до нестандартного. Поэтому была надежда, что Angular все же даст какую-то на основу для создания моделей, но нет.

Так то это не критично, просто хотелось поставить все точки над i.
Я так понимаю, что model — это объект javascript — его можно перевести в json и сохранить в свойстве localstorage и также целиком или частично загружать
Кому интересно 15 июня будет мастер-класс
Ваш первый проект на AngularJS (целый день)
devconf.ru/offers/25
Меня больше волнует, что дорого :( До Москвы бы доехал, на вокзале бы переночевал :) за свой счет, но почти ползарплаты отдать не могу себе позволить :(
Ах, так там еще и за деньги)) Проще самому с докладом выступить
Не рекомендую использовать RequireJS с Ангуляром. Хотя это, конечно, возможно, я не видел ни одного случая, когда применение RequireJS было бы выгодно на практике.

Выгода от применения RequireJS заключается в асинхронной загрузке только необходимых файлов, благодаря чему уменьшается время первоначальной загрузки страницы. Так же не нужно следить за очередью загрузки js файлов, что в крупных проектах (с десятками файлов) приводит к постоянным проблемам, приходится поддерживать определенный порядок загрузки.
Так же когда вы измените лишь один js файл, то клиент скачает только измененный файл, а остальные возьмет из кэша. В случае же одного объединенного js файла клиенту придется скачивать его снова, что опять приводит к большему времени ожидания загрузки.
Так, чтобы понять вас до конца — что в вашем понимании «огромное приложение»?
Sign up to leave a comment.

Articles