2013-07-17 2 views
3

Я использую директиву Code Mirror для форматирования текстовых областей в качестве кода.Как использовать переменную для передачи объектного ключа в Угловую директиву?

Что работает:

<textarea ui-codemirror type="textarea" ng-model="x"></textarea> 

Вы можете установить опции вверх, как так

<textarea ui-codemirror="editorOptions" type="textarea" ng-model="x"></textarea> 

и в вашем контроллере:

$scope.editorOptions = { 
      name: 'javascript', 
      json: true, 
      smartIndent: false, 
      tabSize: 2, 
      lineWrapping : true, 
      lineNumbers: true, 
      mode: 'javascript' 
     } 

Что не работает:

Я пытаюсь динамически изменять editorOptions на основе другой части модели (я поддерживаю Javascript и Markdown).

Так что я пытаюсь это:

$scope.editorOptions = { 
     json: { 
      name: 'javascript', 
      json: true, 
      smartIndent: false, 
      tabSize: 2, 
      lineWrapping : true, 
      lineNumbers: true, 
      mode: 'javascript' 
     }, 
     markdown: { 
      name: 'markdown', 
      json: false, 
      smartIndent: false, 
      tabSize: 2, 
      lineWrapping : true, 
      lineNumbers: true, 
      mode: 'markdown' 
     } 
    }; 

, а затем это в HTML:

<select ng-model='editorType' required ng-options='option.value as option.name for option in editorTypes'></select> 
<textarea ui-codemirror="editorOptions[editorType]" type="textarea" ng-model="x"></textarea> 

Мой вопрос это- Как я могу использовать значение выбора модели (editorType) в указать, какой объект опций используется в директиве mirror?

Я попытался

<textarea ui-codemirror="editorOptions.[editorType]" type="textarea" ng-model="x"></textarea> 
<textarea ui-codemirror="editorOptions[$scope.editorType]" type="textarea" ng-model="x"></textarea> 

все безрезультатно.

Кто-нибудь знает, как правильно это сделать?

Многие, огромное спасибо!

Update Я считаю, что это правильный синтаксис:

ui-codemirror="editorOptions[editorType]". 

Я думаю, что есть проблема с директивой не понимая переменную изменилась.

+0

может у поделиться скрипку или plunker демо –

+1

Я считаю, что проблема может быть директива не знает, что переменная $ scope.editorType изменилась. –

+0

@Hairgami_Master Я думаю, что вы, скорее всего, лаяете по правильной попытке удачи. – shaunhusain

ответ

3

Я не думаю, что это сработает для вас без наложения ui-codemirror. Код в UI-codemirror делает opts = angular.extend({}, options, scope.$eval(attrs.uiCodemirror)); в начале, но он не следит за обновлениями.

Если вы раздвоенный UI-CodeMirror от: https://github.com/angular-ui/ui-codemirror/blob/master/ui-codemirror.js, а затем добавил что-то вроде

attrs.$observe('uiCodemirror', function (newVal, oldVal) { 
    if (newVal !== oldVal) { 
    opts = angular.extend({}, options, scope.$eval(attrs.uiCodemirror)); 
    codeMirror = CodeMirror.fromTextArea(elm[0], opts); //or maybe $timeout(deferredCodemirror) ?? 
    } 
}); 

Тогда это могло бы работать, но я не проверял, что таким образом я понятия не имею, если это действительно будет работать. Возможно, это даст вам представление о том, как создать необходимую вам директиву.

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

+0

Спасибо, мужчина, я просмотрел код и пытался понять, как он работает. Я не знаю достаточно о директивах, чтобы изменить указанную вами линию на двустороннюю привязку или что-то вместо значения стиля init, которое она делает сейчас. На данный момент я закодировал его, но предпочел бы более элегантный подход. Ура! –

+0

Вы бы не «изменили» эту строку, вы просто добавили бы часы позже, которые повторно инициализируют CodeMirror. Этот лакомый кусочек, который я разместил, проверит, изменит ли атрибут ui-codemirror, а затем повторно запустит конструктор CodeMirror. –

+0

Спасибо, Джонатан. Я, мой халатан, был именно тем, что вы подумали, - двумя кодовыми зеркалами. Я собираюсь попробовать вашу технику, когда у меня есть минутка, чтобы дышать. Огромное спасибо. Оставляя его без ответа на данный момент, если кто-то из CodeMirror случится. –

1

Добавление к ответу Джонатана:

attrs.$observe('uiCodemirror', function (newVal, oldVal) 
{ 
    if(newVal !== oldVal) 
    { 
    opts = angular.extend({}, options, scope.$eval(attrs.uiCodemirror)); 
    var keys = Object.keys(opts) 
    if(keys.length != 0) 
    { 
     keys.forEach(function(i) 
     { 
     var v = opts[i]; 
     codeMirror.setOption(i, v); 
     }); 

     $timeout(function() { codeMirror.refresh()}); 
    } 
    } 
}); 
Смежные вопросы