У меня есть шаблон, в котором многие типы предметов являются «редактируемыми». Это означает, что у меня есть много шаблонов (по одному для каждого редактируемого типа элемента), которые ожидают наличия уникальных полей, но общие функции (редактирование, сохранение, отмена редактирования, удаление и т. Д.). Эти общие функции приводят к большому количеству повторений на контроллерах: save
, edit
, cancel
и т. Д., И очень повторяющаяся обработка ошибок.AngularJS: Как перенести и выделить как область выделения, так и родительскую область?
Один из способов, с помощью которого я смотрел, заключался в том, чтобы каждый контроллер «украшал» себя (используя сервис), но он также стал беспорядочным.
Я предпочитаю директиву, скажем, «редактируемый»:
<form name="editGroup" editable>
<div ng-show="editMode">
<!-- lots of fields, e.g. -->
<input type="text" ng-model="name"></input>
<span ng-show="editGroup.name.$error.required">The name is required</span>
<button type="submit" ng-click="save()">Save</button>
<button ng-click="cancel">Cancel</button>
</div>
<div ng-show="!editMode">
<!-- lots of text, e.g. -->
<span>{{name}}</span>
<button ng-click="edit()">Edit</button>
<button ng-click="delete()">Delete</button>
</div>
</form>
Проблема заключается в том, что все модели приходят из области на контроллер, так как они являются уникальными для этого шаблона, в то время как повторяющиеся рамки элементы, такие как функции save()
cancel()
edit()
delete()
все исходит из области выделения ограничений.
Я, ну, области смешивания, и, конечно, я не знаю заранее, какие предметы должны быть доступны. Так что, если я transclude с:
- изолировать сферу: я потеряю доступ к моделям контроллеров в включен через элемент, а также форму для валидаций сфера
- контроллера (по умолчанию): Я потерять доступ к добавлен функции из директивы, которая была точкой директивы в первую очередь!
Я делаю что-то неправильно здесь; Каков лучший (более чистый?) способ сделать это?
Да, хороший момент. И область transclude является дочерней областью. А если я изолируюсь? – deitch
Я ошибся, моя скрипка не создавала новую область, она использовала ту же самую. Я обновил скрипку и, как вы можете видеть, даже если она находится на childScope, вы все равно можете получить доступ к методам из html в директиве. В изолированной области вы можете объявить методы в директиве как '$ scope. $ Parent. $ Save = function ...' [обновленная скрипта, отражающая как унаследованную, так и изолированную область видимости) (http://jsfiddle.net/reimavronicolas/ k7jLa9wq /) –
Я понял. Мне удалось сделать что-то вроде этого, но не играя с родительской областью. – deitch