2

Я создаю одну форму с помощью Bootstrap & AngularJS. Я использую редактор CK на своей странице как textarea. Но я не могу получить значение textarea, в то время как значение входного текстового поля легко фиксируется в моем контроллере AngularJS. Ниже приведен фрагмент кода:Неопределенное значение из области текста в AngularJS

HTML страницы:

<div class="container"> 
    <div ng-controller="controller"> 
     <form role="form"> 

      <label for="sd"><b>Short Description: </b></label> 

      <input ng-model="sdesc" class = "form-control input-xxlarge" type = "text" placeholder ="Provide a short description here."/>  

      <br/> 
      <label for="dt"><b>Details: </b></label> 

      <textarea ng-model="details" class="form-control" name="details_editor" id="details_editor"></textarea> 

      <br/> 

      <button class = "btn btn-primary" ng-click="submitted()">Ask It!</button>    

      <script> 
         CKEDITOR.replace('details_editor'); 
      </script> 
     </form> 
    </div> 

<br/> 
<hr> 
</div> 

JS

app.controller('controller', ['$scope', function($scope){ 
     $scope.submitted = function(){ 
      var sdesc = $scope.sdesc; 
      var details = $scope.details; 

      alert($scope.details); 
     }; 
}]); 

Оповещение показывает undefined для значения текстового поля.

Пожалуйста, помогите мне решить проблему.

+2

Я думаю, что CK заменяет текстовое поле, проверяет DOM после отображения страницы или делает это как '$ timeout (function() {console.log ($ scope.details)}) ', чтобы проверить, является ли это проблемой переваривания – maurycy

+0

Эй, @maurycy - Я на самом деле довольно новичок в веб-разработке. Так что, пожалуйста, расскажите мне больше о том, что делать. После рендеринга страницы, когда я проверяю элемент, я вижу, что текстовая область представлена ​​каким-либо другим элементом DOM, который создается динамически самим редактором CK. Итак, каков правильный способ получить данные? – coderx

+0

Если вы выполняете 'console.log' внутри' $ timeout' в соответствии с моим комментарием, он должен работать, и причина этого в том, что '$ timeout' в угловом графике цикл' $ digest' (вы должны прочитать об этом более подробно если вы новичок в веб-разработке - это угловой конкретный процесс) – maurycy

ответ

2

Вы используете обычную версию редактора CK Javascript и, следовательно, Angular не получает уведомление об обновлении значения ng-model этого textarea.

В основном, Angular запускает цикл дайджеста для обновления всех видов и моделей, но поскольку в этом случае значения, которые изменяются в редакторе CK, происходят за пределами контекста Angular.s, который не обновляет значение ng-model.

Чтобы исправить это, мы добавили небольшую директиву и уведомили об изменении в ng-model Угловому с помощью $timeout. (Мы можем также использовать $apply директиву, но это может произойти сбой иногда, если цикл дайджеста уже в процессе)

Пример директивы:

var app = angular.module("your-app-name", []); 
app.directive("ckEditor", ["$timeout", function($timeout) { 
    return { 
     require: '?ngModel', 
     link: function ($scope, element, attr, ngModelCtrl) { 
      var editor = CKEDITOR.replace(element[0]); 
      console.log(element[0], editor); 

      editor.on("change", function() { 
       $timeout(function() { 
        ngModelCtrl.$setViewValue(editor.getData()); 
       }); 
      }); 

      ngModelCtrl.$render = function (value) { 
       editor.setData(ngModelCtrl.$modelValue); 
      }; 
     } 
    }; 
}]); 

удалить, ваш следующий код:

<script> 
    CKEDITOR.replace('details_editor'); 
</script> 

И, измените свой текстовый редактор следующим образом:

<textarea ng-model="details" class="form-control" ck-editor name="details_editor" id="details_editor"></textarea> 
+0

Невозможно заставить его работать. Когда я использую вашу директивную реализацию, текстовая область изменяется на текстовую область по умолчанию для начальной загрузки. – coderx

+0

Я добавил логин в директиву. Не могли бы вы повторить попытку и рассказать мне о выходе этого журнала. –

+0

Работает. :) – coderx

1

Я нашел ng-ckeditor для реализовать ckeditor в angularjs. См. Это: https://github.com/esvit/ng-ckeditor. Я попробовал это, легко реализовать и работать как ожидалось

+0

Да, я тоже нашел его. Но я начал использовать обычную версию скрипта java для редактора ck. Поэтому я столкнулся с этими проблемами. :) – coderx

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