JavaScript
Angular
Comments 22
+5
Первые два пункта, скорее, относятся даже не к конкретно AngularJS или javascript'у, а к программированию в принципе.
+2
Без сомнений, но в AngularJS как в ярком представителе MVC фреймворка с двусторонним биндингом это очень заметно, потому что тут вся работа производится с данными — массивами, объектами и их свойствами.
+2
По второму пункту было бы неплохо привести пример тех самых «не безопасных директив». Скажем если директива использует скоуп и смотрит за ним, то проблем по идее не должно быть.

jsfiddle.net/XAZFr/ — это то что я смог сходу придумать… но буду рад увидеть более адекватные примеры.
-15
Никакой особенной силы ангуляр не даёт. Он даёт возможность написать статью с пафосным заголовком, в который можно вставить смешную картинку.
+9
И не говорите, все эти языки, фреймворки, инструменты…
Почему нельзя по старинке дырочки в бумажке делать?
-1
Самое смешное то, что все эти клоуны, которые считали что ангуляром можно пользоваться, сейчас пользуют реакт. Но минусы свои не заберут, ггг. Русское IT такое русское.
+2
все эти клоуны, которые считали что ангуляром можно пользоваться, сейчас пользуют реакт.

Какое интересное утверждение подкрепленное лишь фантазией автора. Действительно, русское IT такое русское.
+2
Только недавно была статья про использование директивы Ace, так опять пишут про основы JS и часть документации про изолированные скоупы. К сожалению, самое интересное в посте — картинка. А жаль.
+1
Проблема мэйнстрим-технологий: слишком много шума вокруг, слишком мало людей реально читают документацию. Можете просто посмотреть на количество тупых вопросов связанных с AngularJS которых по хорошему не должно возникать, если человек на нормальном уровне знает JS и хотя бы немного поразбирался с инструментом который использует. Но без развернутого описания, с чем такое поведение связано, ценность статьи снижается.
0
Вообще, при работе с формой, не следует отправлять на сервер объект, связанный с полями формы. Стоит отправить его копию. Простой пример:

В форме используется ресурс
user: {
  email: a@a.ru,
  password: 123
}

делаете user.$save(), получаете в ответ что-то вроде {data: true} (мало ли что может вернуть бэкенд), user становится
user: {
  data: true
}

и поля формы внезапно очищаются.

Чтобы этого не происходило нужно отделять друг от друга объект формы и ресурса
0
а если бэкенд изменяет свойства объекта? например, форматирует текст, приводит номер телефона в нужный формат, вставляет айдишники (мало ли что может делать бэкенд). Тогда нужно опять вручную прокидывать изменения в модель?..
0
Вообще имеет смысл использовать нормальные объекты для хранения данных внутри приложения. То есть у нас есть объект Mymodel, который умеет из данных приходящих с сервера формировать данные для нашего приложения, у нас есть метод serializer/marshal/toJSON, который подготавливает данные для отправки на сервер.

Для своих проектов коллега реализовал небольшой враппер для моделей и коллекций оных по аналогии с backbone. Сейчас обкатываем на проекте.
0
Слава богу, мы не стали городить таких костылей, не смотря на то, что переписали всё с Бекбона. Обычный ангуляровский ресурс отлично справляется и логика модель=объект отлично ложится на приложение
0
Странно, конечно. Но если на бэкенде такая логика, то будет одна модель, да.
+1
В Angular 1.2 появились alias для контроллеров.

<div ng-controller="StoreController as store">{{store.name}}</div>

app.controller('StoreController', function() {
	this.name = 'this.name';
});

Пример использования jsfiddle.net/5UW2X/
Используя alias, аргумент $scope для контроллера становится не обязательным, но в дочерних контроллерах, что бы получить доступ родительскому контроллеру необходимо обратиться через $scope.[aliasName].some

P.S. $scope.$watch возращает функцию, при вызове которой слежение прекратиться
var unwatch = $scope.$watch("some", function () {
	//only one time callback
	unwatch();
});

+1
Вторая проблема, как и третья, решаются одинаково: $scope — это не модель, а контейнер моделей. Столько копий уже об это сломано.

Так что ваш пример, хоть и корректен, но является плохой практикой.
Если есть необходимость обнулять массив, то это сигнал, что он должен быть свойством другого объекта (модели)

$scope.model.array

Раньше еще часто замечали, что в ng-model должна быть минимум одна точка, тогда никогда не словите эту проблему и не будете иметь геморроя с хаками вроде array.length = 0…
По опыту: рано или поздно, если нарушать это правило, проблему не только словите, но и пропустите в продакшн, не заметив где-нибудь, и вот тогда уже перестаните это делать.
0
Я вообще-то пользуюсь точкой обычно, но чисто ради интереса — а как очистить объект?
0
В нутри ngResource есть что-то похожее — функция shallowClearAndCopy. Посмотрите ее содержимое.
0
По первому пункту: зачем вообще нужна var emptyObject = {...}? Почему не переместить код инициализации пустого объекта в тело createEmptyEntity() и избавиться от необходимости что-то копировать и помнить об этом?
0
Я намеревался как можно проще проиллюстрировать ситуацию, когда один экземпляр объекта может использоваться много раз.
0
По второму пункту — если не нужна цепочка прототипов можно сделать так:
angular.copy($scope.myObj, newObj); 
Only those users with full accounts are able to leave comments.  , please.