Почему в документации модели AngularJS не используется точка?

В видео AngularJS MTV Meetup: Best Practices (2012/12/11), Мишко объясняет: "Если вы используете ng-model там где-то должна быть точка. Если у вас нет точки, вы делаете это неправильно.."

Однако самый первый пример (The Basics) на веб-сайте Angular.JS, похоже, противоречит ему. Что дает? С Angular.JS изменилось с момента встречи MTV, что теперь он более прощает ng-модель?

Ответ 1

Эта маленькая точка очень важна при рассмотрении сложностей наследования сферы.

egghead.io видео "The Dot" имеет действительно хороший обзор, так же как и этот очень популярный вопрос: Каковы нюансы объема прототипа/прототипного наследования в AngularJS?

Я попытаюсь суммировать его здесь:

Angular.js использует область наследования, чтобы позволить дочерней области (например, дочернему контроллеру) видеть свойства родительской области. Итак, скажем, у вас была настройка вроде:

<div ng-controller="ParentCtrl">
    <input type="text" ng-model="foo"/>
    <div ng-controller="ChildCtrl">
        <input type="text" ng-model="foo"/>
    </div>
</div>

(Играйте на JSFiddle)

Сначала, если вы запустили приложение и набрали его в родительский ввод, он обновится, чтобы отразить его.

Однако, если вы редактируете область дочернего элемента, соединение с родителем теперь прерывается, а два больше не синхронизируются. С другой стороны, если вы используете ng-model="baz.bar", ссылка останется.

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

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

Подробнее о подробностях см. fooobar.com/questions/512/...

Ответ 2

Точка будет требоваться, если вы прототипически наследуете одну область от другой, например, в случае ng-repeat создается новая область для каждой позиции, которая наследуется от родительской области. В базовом примере нет наследования прототипов, поскольку существует только одна область действия, но если у вас есть несколько дочерних областей, то вы столкнетесь с проблемой. Ссылка ниже сделает все ясно.

https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat

Ответ 3

Итак, чтобы решить эту проблему, убедитесь, что в JS вы сначала объявляете родителя:

например.

$scope.parent

а затем:

$scope.parent.child = "Imma child";

выполнение только дочернего элемента без родительского слома будет Angular.