|
| 1 | +ko.bindingHandlers.quill = { |
| 2 | + |
| 3 | + init: function (element, valueAccessor, allBindings, viewModel, bindingContext) { |
| 4 | + var params = valueAccessor(); |
| 5 | + |
| 6 | + // Check whether the value observable is either placed directly or in the paramaters object. |
| 7 | + if (!(ko.isObservable(params) || params["html"] || params["text"])) { |
| 8 | + throw ("You need to define an observable value for the 'quill' binding. " + |
| 9 | + "Either pass the observable directly or as the 'html' or 'text' " + |
| 10 | + "field in the parameters."); |
| 11 | + } |
| 12 | + |
| 13 | + // Initialize the quill editor, and store it in the data section of the |
| 14 | + // element using jQuery. |
| 15 | + var quill = new Quill(element, { theme: "snow" }); |
| 16 | + $.data(element, "quill", quill); |
| 17 | + |
| 18 | + // Extract the knockout observables and set the initial value. |
| 19 | + var htmlObservable = null; |
| 20 | + var textObservable = null; |
| 21 | + var toolbarSelector = null; |
| 22 | + if (ko.isObservable(params)) { |
| 23 | + htmlObservable = params; |
| 24 | + quill.setHTML(ko.unwrap(htmlObservable)); |
| 25 | + } |
| 26 | + else { |
| 27 | + htmlObservable = params["html"]; |
| 28 | + textObservable = params["text"]; |
| 29 | + toolbarSelector = params["toolbar"]; |
| 30 | + |
| 31 | + if (htmlObservable) { |
| 32 | + quill.setHTML(ko.unwrap(htmlObservable) || ""); |
| 33 | + } else if (textObservable) { |
| 34 | + quill.setText(ko.unwrap(textObservable) || ""); |
| 35 | + } |
| 36 | + if (toolbarSelector) { |
| 37 | + quill.addModule("toolbar", { container: toolbarSelector }); |
| 38 | + } |
| 39 | + } |
| 40 | + |
| 41 | + // Make sure we update the observables when the editor contents change. |
| 42 | + quill.on("text-change", function(delta, source) { |
| 43 | + if (htmlObservable && ko.isObservable(htmlObservable)) { |
| 44 | + htmlObservable(quill.getHTML()); |
| 45 | + } |
| 46 | + if (textObservable && ko.isObservable(textObservable)) { |
| 47 | + textObservable(quill.getText()); |
| 48 | + } |
| 49 | + }); |
| 50 | + }, |
| 51 | + |
| 52 | + update: function (element, valueAccessor, allBindings, viewModel, bindingContext) { |
| 53 | + // Extract the knockout observables. |
| 54 | + var params = valueAccessor(); |
| 55 | + var htmlObservable = null; |
| 56 | + var textObservable = null; |
| 57 | + var enableObservable = null; |
| 58 | + if (ko.isObservable(params)) { |
| 59 | + htmlObservable = params; |
| 60 | + } else { |
| 61 | + htmlObservable = params["html"]; |
| 62 | + textObservable = params["text"]; |
| 63 | + enableObservable = params["enable"]; |
| 64 | + } |
| 65 | + |
| 66 | + // Update the relevant values in the Quill editor. |
| 67 | + var quill = $.data(element, "quill"); |
| 68 | + var selection = quill.getSelection(); |
| 69 | + if (htmlObservable) { |
| 70 | + quill.setHTML(ko.unwrap(htmlObservable) || ""); |
| 71 | + } else if (textObservable) { |
| 72 | + quill.setText(ko.unwrap(textObservable) || ""); |
| 73 | + } |
| 74 | + if (enableObservable) { |
| 75 | + quill.editor.enable(ko.unwrap(enableObservable)); |
| 76 | + } |
| 77 | + quill.setSelection(selection); |
| 78 | + } |
| 79 | + |
| 80 | +}; |
0 commit comments