Если вы не используете точку (.) В своих моделях 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объект, он может напрямую использовать его значения без какого-либо прототипического наследования.

Думайте об этом как о передаче объекта между областями.

Другие вопросы по тегам