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

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

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

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

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

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

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

Для своих проектов коллега реализовал небольшой враппер для моделей и коллекций оных по аналогии с backbone. Сейчас обкатываем на проекте.
Слава богу, мы не стали городить таких костылей, не смотря на то, что переписали всё с Бекбона. Обычный ангуляровский ресурс отлично справляется и логика модель=объект отлично ложится на приложение
Странно, конечно. Но если на бэкенде такая логика, то будет одна модель, да.
В 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();
});

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

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

$scope.model.array

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