UNPKG

angular-redactor

Version:
76 lines (65 loc) 2.93 kB
(function() { 'use strict'; /** * usage: <textarea ng-model="content" redactor></textarea> * * additional options: * redactor: hash (pass in a redactor options hash) * */ var redactorOptions = {}; angular.module('angular-redactor', []) .constant('redactorOptions', redactorOptions) .directive('redactor', ['$timeout', function($timeout) { return { restrict: 'A', require: 'ngModel', link: function(scope, element, attrs, ngModel) { // Expose scope var with loaded state of Redactor scope.redactorLoaded = false; var updateModel = function updateModel(value) { // $timeout to avoid $digest collision $timeout(function() { scope.$apply(function() { ngModel.$setViewValue(value); }); }); }, options = { changeCallback: updateModel }, additionalOptions = attrs.redactor ? scope.$eval(attrs.redactor) : {}, editor; angular.extend(options, redactorOptions, additionalOptions); // prevent collision with the constant values on ChangeCallback var changeCallback = additionalOptions.changeCallback || redactorOptions.changeCallback; if (changeCallback) { options.changeCallback = function(value) { updateModel.call(this, value); changeCallback.call(this, value); } } // put in timeout to avoid $digest collision. call render() to // set the initial value. $timeout(function() { editor = element.redactor(options); ngModel.$render(); element.on('remove',function(){ element.off('remove'); element.redactor('core.destroy'); }); }); ngModel.$render = function() { if(angular.isDefined(editor)) { $timeout(function() { element.redactor('code.set', ngModel.$viewValue || ''); element.redactor('placeholder.toggle'); scope.redactorLoaded = true; }); } }; } }; }]); })();