diff --git a/angular-ckeditor.js b/angular-ckeditor.js index 3fbade6..e44cb76 100644 --- a/angular-ckeditor.js +++ b/angular-ckeditor.js @@ -3,16 +3,11 @@ if (typeof define === 'function' && define.amd) define(['angular'], factory); // Global else factory(angular); -}(this, function (angular) { +} (this, function (angular) { angular - .module('ckeditor', []) - .directive('ckeditor', ['$parse', ckeditorDirective]); - - // Polyfill setImmediate function. - var setImmediate = window && window.setImmediate ? window.setImmediate : function (fn) { - setTimeout(fn, 0); - }; + .module('ckeditor', []) + .directive('ckeditor', ['$parse', ckeditorDirective]); /** * CKEditor directive. @@ -47,15 +42,14 @@ }); }); - controller.instance.setReadOnly(!! attrs.readonly); + controller.instance.setReadOnly(!!attrs.readonly); attrs.$observe('readonly', function (readonly) { - controller.instance.setReadOnly(!! readonly); + controller.instance.setReadOnly(!!readonly); }); - // Defer the ready handler calling to ensure that the editor is - // completely ready and populated with data. - setImmediate(function () { - $parse(attrs.ready)(scope); + // Call evalAsync and pass the editor instance as parameter + scope.$evalAsync(function () { + $parse(attrs.ready)(scope, { editor: controller.instance }); }); }); @@ -81,7 +75,7 @@ // Create editor instance. if (editorElement.hasAttribute('contenteditable') && - editorElement.getAttribute('contenteditable').toLowerCase() == 'true') { + editorElement.getAttribute('contenteditable').toLowerCase() == 'true') { instance = this.instance = CKEDITOR.inline(editorElement, config); } else { @@ -90,7 +84,7 @@ /** * Listen on events of a given type. - * This make all event asynchronous and wrapped in $scope.$apply. + * This make all event asynchronous and wrapped in $scope.$evalAsync. * * @param {String} event * @param {Function} listener @@ -102,14 +96,12 @@ function asyncListener() { var args = arguments; - setImmediate(function () { - applyListener.apply(null, args); - }); + applyListener.apply(null, args); } function applyListener() { var args = arguments; - $scope.$apply(function () { + $scope.$evalAsync(function () { listener.apply(null, args); }); } @@ -120,7 +112,7 @@ }; }; - this.onCKEvent('instanceReady', function() { + this.onCKEvent('instanceReady', function () { readyDeferred.resolve(true); }); @@ -136,7 +128,7 @@ // Destroy editor when the scope is destroyed. $scope.$on('$destroy', function onDestroy() { // do not delete too fast or pending events will throw errors - readyDeferred.promise.then(function() { + readyDeferred.promise.then(function () { instance.destroy(false); }); }); diff --git a/angular-ckeditor.min.js b/angular-ckeditor.min.js index 29f3036..e8a972f 100644 --- a/angular-ckeditor.min.js +++ b/angular-ckeditor.min.js @@ -1,2 +1,2 @@ -!function(a,b){"function"==typeof define&&define.amd?define(["angular"],b):b(angular)}(this,function(a){function b(a){return{restrict:"A",require:["ckeditor","ngModel"],controller:["$scope","$element","$attrs","$parse","$q",c],link:function(b,c,e,f){var g=f[0],h=f[1];g.ready().then(function(){["dataReady","change","blur","saveSnapshot"].forEach(function(a){g.onCKEvent(a,function(){h.$setViewValue(g.instance.getData()||"")})}),g.instance.setReadOnly(!!e.readonly),e.$observe("readonly",function(a){g.instance.setReadOnly(!!a)}),d(function(){a(e.ready)(b)})}),h.$render=function(){g.ready().then(function(){g.instance.setData(h.$viewValue||"")})}}}}function c(a,b,c,e,f){var g,h=e(c.ckeditor)(a)||{},i=b[0],j=f.defer();g=this.instance=i.hasAttribute("contenteditable")&&"true"==i.getAttribute("contenteditable").toLowerCase()?CKEDITOR.inline(i,h):CKEDITOR.replace(i,h),this.onCKEvent=function(b,c){function e(){var a=arguments;d(function(){f.apply(null,a)})}function f(){var b=arguments;a.$apply(function(){c.apply(null,b)})}return g.on(b,e),function(){g.removeListener(b,f)}},this.onCKEvent("instanceReady",function(){j.resolve(!0)}),this.ready=function(){return j.promise},a.$on("$destroy",function(){j.promise.then(function(){g.destroy(!1)})})}a.module("ckeditor",[]).directive("ckeditor",["$parse",b]);var d=window&&window.setImmediate?window.setImmediate:function(a){setTimeout(a,0)}}); +!function(a,b){"function"==typeof define&&define.amd?define(["angular"],b):b(angular)}(this,function(a){function b(a){return{restrict:"A",require:["ckeditor","ngModel"],controller:["$scope","$element","$attrs","$parse","$q",c],link:function(b,c,d,e){var f=e[0],g=e[1];f.ready().then(function(){["dataReady","change","blur","saveSnapshot"].forEach(function(a){f.onCKEvent(a,function(){g.$setViewValue(f.instance.getData()||"")})}),f.instance.setReadOnly(!!d.readonly),d.$observe("readonly",function(a){f.instance.setReadOnly(!!a)}),b.$evalAsync(function(){a(d.ready)(b,{editor:f.instance})})}),g.$render=function(){f.ready().then(function(){f.instance.setData(g.$viewValue||"")})}}}}function c(a,b,c,d,e){var f,g=d(c.ckeditor)(a)||{},h=b[0],i=e.defer();f=h.hasAttribute("contenteditable")&&"true"==h.getAttribute("contenteditable").toLowerCase()?this.instance=CKEDITOR.inline(h,g):this.instance=CKEDITOR.replace(h,g),this.onCKEvent=function(b,c){function d(){var a=arguments;e.apply(null,a)}function e(){var b=arguments;a.$evalAsync(function(){c.apply(null,b)})}return f.on(b,d),function(){f.removeListener(b,e)}},this.onCKEvent("instanceReady",function(){i.resolve(!0)}),this.ready=function(){return i.promise},a.$on("$destroy",function(){i.promise.then(function(){f.destroy(!1)})})}a.module("ckeditor",[]).directive("ckeditor",["$parse",b])}); //# sourceMappingURL=angular-ckeditor.min.map \ No newline at end of file diff --git a/angular-ckeditor.min.map b/angular-ckeditor.min.map index 65a23d2..185a377 100644 --- a/angular-ckeditor.min.map +++ b/angular-ckeditor.min.map @@ -1 +1 @@ -{"version":3,"file":"angular-ckeditor.min.js","sources":["angular-ckeditor.js"],"names":["root","factory","define","amd","angular","this","ckeditorDirective","$parse","restrict","require","controller","ckeditorController","link","scope","element","attrs","ctrls","ngModelController","ready","then","forEach","event","onCKEvent","$setViewValue","instance","getData","setReadOnly","readonly","$observe","setImmediate","$render","setData","$viewValue","$scope","$element","$attrs","$q","config","ckeditor","editorElement","readyDeferred","defer","hasAttribute","getAttribute","toLowerCase","CKEDITOR","inline","replace","listener","asyncListener","args","arguments","applyListener","apply","$apply","on","removeListener","resolve","promise","$on","destroy","module","directive","window","fn","setTimeout"],"mappings":"CAAC,SAAUA,EAAMC,GAEO,kBAAXC,SAAyBA,OAAOC,IAAKD,QAAQ,WAAYD,GAE/DA,EAAQG,UACbC,KAAM,SAAUD,GAkBhB,QAASE,GAAkBC,GACzB,OACEC,SAAU,IACVC,SAAU,WAAY,WACtBC,YACE,SACA,WACA,SACA,SACA,KACAC,GAEFC,KAAM,SAAUC,EAAOC,EAASC,EAAOC,GAErC,GAAIN,GAAaM,EAAM,GACnBC,EAAoBD,EAAM,EAG9BN,GAAWQ,QAAQC,KAAK,YAErB,YAAa,SAAU,OAAQ,gBAAgBC,QAAQ,SAAUC,GAChEX,EAAWY,UAAUD,EAAO,WAC1BJ,EAAkBM,cAAcb,EAAWc,SAASC,WAAa,QAIrEf,EAAWc,SAASE,cAAeX,EAAMY,UACzCZ,EAAMa,SAAS,WAAY,SAAUD,GACnCjB,EAAWc,SAASE,cAAeC,KAKrCE,EAAa,WACXtB,EAAOQ,EAAMG,OAAOL,OAKxBI,EAAkBa,QAAU,WAC1BpB,EAAWQ,QAAQC,KAAK,WACtBT,EAAWc,SAASO,QAAQd,EAAkBe,YAAc,SAWtE,QAASrB,GAAmBsB,EAAQC,EAAUC,EAAQ5B,EAAQ6B,GAC5D,GAEIZ,GAFAa,EAAS9B,EAAO4B,EAAOG,UAAUL,OACjCM,EAAgBL,EAAS,GAEzBM,EAAgBJ,EAAGK,OAKrBjB,GAAWnB,KAAKmB,SAFde,EAAcG,aAAa,oBACoC,QAA/DH,EAAcI,aAAa,mBAAmBC,cACrBC,SAASC,OAAOP,EAAeF,GAG/BQ,SAASE,QAAQR,EAAeF,GAY7DhC,KAAKiB,UAAY,SAAUD,EAAO2B,GAGhC,QAASC,KACP,GAAIC,GAAOC,SACXtB,GAAa,WACXuB,EAAcC,MAAM,KAAMH,KAI9B,QAASE,KACP,GAAIF,GAAOC,SACXlB,GAAOqB,OAAO,WACZN,EAASK,MAAM,KAAMH,KAKzB,MAjBA1B,GAAS+B,GAAGlC,EAAO4B,GAiBZ,WACLzB,EAASgC,eAAenC,EAAO+B,KAInC/C,KAAKiB,UAAU,gBAAiB,WAC9BkB,EAAciB,SAAQ,KAQxBpD,KAAKa,MAAQ,WACX,MAAOsB,GAAckB,SAIvBzB,EAAO0B,IAAI,WAAY,WAErBnB,EAAckB,QAAQvC,KAAK,WACzBK,EAASoC,SAAQ,OApIvBxD,EACCyD,OAAO,eACPC,UAAU,YAAa,SAAUxD,GAGlC,IAAIuB,GAAekC,QAAUA,OAAOlC,aAAekC,OAAOlC,aAAe,SAAUmC,GACjFC,WAAWD,EAAI"} \ No newline at end of file +{"version":3,"sources":["angular-ckeditor.js"],"names":["root","factory","define","amd","angular","this","ckeditorDirective","$parse","restrict","require","controller","ckeditorController","link","scope","element","attrs","ctrls","ngModelController","ready","then","forEach","event","onCKEvent","$setViewValue","instance","getData","setReadOnly","readonly","$observe","$evalAsync","editor","$render","setData","$viewValue","$scope","$element","$attrs","$q","config","ckeditor","editorElement","readyDeferred","defer","hasAttribute","getAttribute","toLowerCase","CKEDITOR","inline","replace","listener","asyncListener","args","arguments","applyListener","apply","on","removeListener","resolve","promise","$on","destroy","module","directive"],"mappings":"CAAC,SAAUA,EAAMC,GAEO,kBAAXC,SAAyBA,OAAOC,IAAKD,QAAQ,WAAYD,GAE/DA,EAAQG,UACZC,KAAM,SAAUD,GAajB,QAASE,GAAkBC,GACzB,OACEC,SAAU,IACVC,SAAU,WAAY,WACtBC,YACE,SACA,WACA,SACA,SACA,KACAC,GAEFC,KAAM,SAAUC,EAAOC,EAASC,EAAOC,GAErC,GAAIN,GAAaM,EAAM,GACnBC,EAAoBD,EAAM,EAG9BN,GAAWQ,QAAQC,KAAK,YAErB,YAAa,SAAU,OAAQ,gBAAgBC,QAAQ,SAAUC,GAChEX,EAAWY,UAAUD,EAAO,WAC1BJ,EAAkBM,cAAcb,EAAWc,SAASC,WAAa,QAIrEf,EAAWc,SAASE,cAAcX,EAAMY,UACxCZ,EAAMa,SAAS,WAAY,SAAUD,GACnCjB,EAAWc,SAASE,cAAcC,KAIpCd,EAAMgB,WAAW,WACftB,EAAOQ,EAAMG,OAAOL,GAASiB,OAAQpB,EAAWc,eAKpDP,EAAkBc,QAAU,WAC1BrB,EAAWQ,QAAQC,KAAK,WACtBT,EAAWc,SAASQ,QAAQf,EAAkBgB,YAAc,SAWtE,QAAStB,GAAmBuB,EAAQC,EAAUC,EAAQ7B,EAAQ8B,GAC5D,GAEIb,GAFAc,EAAS/B,EAAO6B,EAAOG,UAAUL,OACjCM,EAAgBL,EAAS,GAEzBM,EAAgBJ,EAAGK,OAKrBlB,GAFEgB,EAAcG,aAAa,oBACkC,QAA/DH,EAAcI,aAAa,mBAAmBC,cACnCxC,KAAKmB,SAAWsB,SAASC,OAAOP,EAAeF,GAG/CjC,KAAKmB,SAAWsB,SAASE,QAAQR,EAAeF,GAY7DjC,KAAKiB,UAAY,SAAUD,EAAO4B,GAGhC,QAASC,KACP,GAAIC,GAAOC,SACXC,GAAcC,MAAM,KAAMH,GAG5B,QAASE,KACP,GAAIF,GAAOC,SACXlB,GAAOL,WAAW,WAChBoB,EAASK,MAAM,KAAMH,KAKzB,MAfA3B,GAAS+B,GAAGlC,EAAO6B,GAeZ,WACL1B,EAASgC,eAAenC,EAAOgC,KAInChD,KAAKiB,UAAU,gBAAiB,WAC9BmB,EAAcgB,SAAQ,KAQxBpD,KAAKa,MAAQ,WACX,MAAOuB,GAAciB,SAIvBxB,EAAOyB,IAAI,WAAY,WAErBlB,EAAciB,QAAQvC,KAAK,WACzBK,EAASoC,SAAQ,OA5HvBxD,EACGyD,OAAO,eACPC,UAAU,YAAa,SAAUxD","file":"angular-ckeditor.min.js"} \ No newline at end of file