2

У меня есть шаблон, в котором многие типы предметов являются «редактируемыми». Это означает, что у меня есть много шаблонов (по одному для каждого редактируемого типа элемента), которые ожидают наличия уникальных полей, но общие функции (редактирование, сохранение, отмена редактирования, удаление и т. Д.). Эти общие функции приводят к большому количеству повторений на контроллерах: 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 с:

  • изолировать сферу: я потеряю доступ к моделям контроллеров в включен через элемент, а также форму для валидаций
  • сфера
  • контроллера (по умолчанию): Я потерять доступ к добавлен функции из директивы, которая была точкой директивы в первую очередь!

Я делаю что-то неправильно здесь; Каков лучший (более чистый?) способ сделать это?

+0

Да, хороший момент. И область transclude является дочерней областью. А если я изолируюсь? – deitch

+0

Я ошибся, моя скрипка не создавала новую область, она использовала ту же самую. Я обновил скрипку и, как вы можете видеть, даже если она находится на childScope, вы все равно можете получить доступ к методам из html в директиве. В изолированной области вы можете объявить методы в директиве как '$ scope. $ Parent. $ Save = function ...' [обновленная скрипта, отражающая как унаследованную, так и изолированную область видимости) (http://jsfiddle.net/reimavronicolas/ k7jLa9wq /) –

+0

Я понял. Мне удалось сделать что-то вроде этого, но не играя с родительской областью. – deitch

ответ

5

Мне удалось выяснить это, уклонившись от ng-transclude и выполнив мое собственное заключение в функции связи.

Ниже приводится эквивалент нормального ng-transclude:

link: function (scope,element,attrs,ctrlr,transclude) { 
    var sc = scope.$parent.$new(); 
    transclude(sc,function(clone,scope) { 
     element.append(clone); // or however else you want to manipulate the DOM 
    }); 
} 

Добавляя функции непосредственно на transclude ребенка рамки, я был в состоянии иметь все работы, не мешая с родительской области, которые Я действительно не хотел этого делать.

link: function (scope,element,attrs,ctrlr,transclude) { 
    var sc = scope.$parent.$new(); 
    sc.editMode = false; 
    sc.save = function() { 
    }; 
    sc.edit = function() { 
    sc.editMode = true; 
    }; 
    // etc. 
    transclude(sc,function(clone,scope) { 
     element.append(clone); // or however else you want to manipulate the DOM 
    }); 
} 

Лучшее из обоих миров!

+0

Можете ли вы показать полный код здесь или предоставить рабочую демонстрацию? –

+1

Несомненно. Вот работающий jsfiddle. Это грубо и просто, но это работает. – deitch

+0

Упс, нужна скрипка http://jsfiddle.net/rfo0pfvm/1/ – deitch

 Смежные вопросы

  • Нет связанных вопросов^_^