Если вы не используете точку (.) В своих моделях AngularJS, вы делаете это неправильно?
Я помню, как видел эту знаменитую цитату из видео на AngularJS, где говорилось, что всегда следует использовать. (точка) в ваших моделях.
Ну, я пытаюсь следовать этому сказать, у меня есть
var item = {}
item.title = "Easy Access to support";
item.available = true;
item.price = 31.67;
Так что это прекрасно работает, на мой взгляд, я делаю
{{ item.title }}
{{ item.available }}
Я использую точку, поэтому я думаю, что это хорошо.
Но у меня есть некоторые свойства, которые я не считаю частью модели, но, возможно, я ошибаюсь. Например, у меня есть свойство, которое я использую, чтобы включить или отключить кнопку с помощью ng-disable, я ввел это с использованием точечного формата. Его в основном ввели так
$scope.disableButton = true;
и я использую это как
ng-disable="disableButton"......
Должен ли я сделать эту часть модели "предметом"? или создать другой объект JS просто так, чтобы я мог держать это свойство, используя точку?
Кто-нибудь знает, если это приемлемо, или я должен делать все (даже эти простые свойства) с.dot??
Спасибо
2 ответа
"В вашей модели всегда должна быть точка" относится к ngModel
, Эта директива делает двустороннее связывание. Если вы выполняете двустороннее связывание с примитивом (например, с логическим значением в вашем случае), установщик установит его в текущей области, а не в области, в которой он определен, что может вызвать головную боль, если у вас большой пользовательский интерфейс с большим количеством дочерних областей. Это не относится к другим директивам, таким как ngDisable
, Смотрите это объяснение для более подробной информации по этой конкретной проблеме.
Пример сценария: родительская область с $scope.foo = "bar"
и дочерняя область с <input type="text" data-ng-model="foo">
, Будет отображаться bar
изначально, но как только пользователь меняет значение, foo
будет создан в дочерней области, и привязка будет читать и записывать это значение. Родители foo
останется bar
, Надеюсь, что это обобщает это хорошо.
Таким образом, для ngModel
В целях, возможно, вам придется создать объект, чтобы обойти такие проблемы связывания, но для любой другой директивы у вас должна быть регулярная логическая группировка.
Вот ситуация, когда нужна точка.
Когда у вас есть
$scope
значение, которое вы хотите использовать в качестве значения ngModel (назовем его ), у вас может возникнуть соблазн просто создать
$scope.selectedItem
и передать это в шаблон. Однако это опасно, если шаблон создает дочерние области .
Существуют определенные директивы AngularJS, которые создают дочерние области:
-
ngRepeat
-
ngIf
-
ngController
- ... и другие (на их странице документа будет написано «Эта директива создает новую область» под заголовком «Использование»).
Дочерние области опасны из-за того, как работает наследование областей. Отношения таковы:
-- $parent scope
├ selectedItem
└─ $child scope
В качестве дочерней области объект прототипически наследуется от . Это термин javascript, который в основном означает, что вы можете получить любое свойство, получив
$child.<property>
. Но вы не можете устанавливать значения, в чем проблема. Именно так работает javascript.
Таким образом, шаблон может получить доступ
$parent.selectedItem
чтением . Но если шаблон устанавливает
$child.selectedItem
, он устанавливает его не
$parent
, так что теперь у вас есть две версии:
-- $parent scope
├ selectedItem
└─ $child scope
└ selectedItem
А также
ngModel
директивы как получают , так и устанавливают значение области видимости. Получение работает, но настройка ломает вещи (другие объяснили).
Почему использование точки решает проблему
Когда вы храните
selectedItem
значение с точкой в родительской области (например,
$scope.vm.selectedItem
, то шаблон дочерней области получает только объект.
При использовании отношение выглядит следующим образом:
-- $parent scope
├ selectedItem
│ └─ vm
│ └─ selectedItem
└─ $child scope
The
$child
область действия только когда-либо читает объект; он никогда не записывает новый объект (в JS объекты являются ссылками, а не значениями). А прототипическое наследование задействовано только при доступе к файлам . После того, как область получает
vm
объект, он может напрямую использовать его значения без какого-либо прототипического наследования.
Думайте об этом как о передаче объекта между областями.