Skip to content
This repository was archived by the owner on May 25, 2019. It is now read-only.

Commit 36dfbc5

Browse files
committed
chore: udpate codemirror options setting
Following #61
1 parent 4d7705b commit 36dfbc5

File tree

2 files changed

+43
-56
lines changed

2 files changed

+43
-56
lines changed

src/ui-codemirror.js

+15-23
Original file line numberDiff line numberDiff line change
@@ -21,42 +21,34 @@ angular.module('ui.codemirror', [])
2121
return function postLink(scope, iElement, iAttrs, ngModel) {
2222

2323

24-
var options, opts, codeMirror, value;
24+
var options, opts, codeMirror, initialTextValue;
2525

26-
value = iElement.text();
26+
initialTextValue = iElement.text();
27+
28+
options = uiCodemirrorConfig.codemirror || {};
29+
opts = angular.extend({ value: initialTextValue }, options, scope.$eval(iAttrs.uiCodemirror), scope.$eval(iAttrs.uiCodemirrorOpts));
2730

2831
if (iElement[0].tagName === 'TEXTAREA') {
2932
// Might bug but still ...
30-
codeMirror = window.CodeMirror.fromTextArea(iElement[0], {
31-
value: value
32-
});
33+
codeMirror = window.CodeMirror.fromTextArea(iElement[0], opts);
3334
} else {
3435
iElement.html('');
3536
codeMirror = new window.CodeMirror(function(cm_el) {
3637
iElement.append(cm_el);
37-
}, {
38-
value: value
39-
});
40-
}
41-
42-
options = uiCodemirrorConfig.codemirror || {};
43-
opts = angular.extend({}, options, scope.$eval(iAttrs.uiCodemirror), scope.$eval(iAttrs.uiCodemirrorOpts));
44-
45-
function updateOptions(newValues) {
46-
for (var key in newValues) {
47-
if (newValues.hasOwnProperty(key)) {
48-
codeMirror.setOption(key, newValues[key]);
49-
}
50-
}
38+
}, opts);
5139
}
5240

53-
updateOptions(opts);
54-
5541
if (iAttrs.uiCodemirror) {
56-
scope.$watch(iAttrs.uiCodemirror, updateOptions, true);
42+
var codemirrorDefaultsKeys = Object.keys(window.CodeMirror.defaults);
43+
scope.$watch(iAttrs.uiCodemirror, function updateOptions(newValues, oldValue) {
44+
codemirrorDefaultsKeys.forEach(function (key) {
45+
if (newValues.hasOwnProperty(key) && newValues[key] !== oldValue[key]) {
46+
codeMirror.setOption(key, newValues[key]);
47+
}
48+
});
49+
}, true);
5750
}
5851

59-
6052
if (ngModel) {
6153
// CodeMirror expects a string, so make sure it gets one.
6254
// This does not change the model.

test/codemirror.spec.js

+28-33
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ describe('uiCodemirror', function () {
55

66
// declare these up here to be global to all tests
77
var scope, $compile, $timeout, uiConfig;
8+
var codemirrorDefaults = window.CodeMirror.defaults;
89

910
beforeEach(function(){
1011
module('ui.codemirror');
@@ -104,11 +105,13 @@ describe('uiCodemirror', function () {
104105

105106
beforeEach(function () {
106107
var _constructor = window.CodeMirror;
107-
spyOn(window, 'CodeMirror').andCallFake(function () {
108+
window.CodeMirror = jasmine.createSpy('window.CodeMirror').andCallFake(function () {
108109
codemirror = _constructor.apply(this, arguments);
109110
spies(codemirror);
110111
return codemirror;
111112
});
113+
114+
window.CodeMirror.defaults = codemirrorDefaults;
112115
});
113116

114117

@@ -142,60 +145,57 @@ describe('uiCodemirror', function () {
142145
});
143146

144147

145-
describe('setOptions', function () {
148+
describe('options', function () {
146149

147150
spies = function (codemirror) {
148-
spyOn(codemirror, 'setOption').andCallThrough();
151+
codemirror._setOption = codemirror._setOption || codemirror.setOption;
152+
codemirror.setOption = jasmine.createSpy('codemirror.setOption').andCallFake(function () {
153+
codemirror._setOption.apply(this, arguments);
154+
});
149155
};
150156

151157
it('should not be called', function () {
152158
$compile('<div ui-codemirror></div>')(scope);
159+
expect(window.CodeMirror).toHaveBeenCalledWith(jasmine.any(Function), codemirrorDefaults);
153160
expect(codemirror.setOption).not.toHaveBeenCalled();
154161
});
155162

156-
it('should include the passed options', function () {
163+
it('should include the passed options (attribute directive)', function () {
157164
$compile('<div ui-codemirror="{oof: \'baar\'}"></div>')(scope);
158165

159-
expect(codemirror.setOption).toHaveBeenCalled();
160-
expect(codemirror.setOption.calls.length).toEqual(1);
161-
expect(codemirror.setOption).toHaveBeenCalledWith('oof', 'baar');
166+
expect(window.CodeMirror).toHaveBeenCalledWith(jasmine.any(Function), angular.extend(codemirrorDefaults, { oof: 'baar' }));
167+
expect(codemirror.setOption).not.toHaveBeenCalled();
168+
});
162169

170+
it('should include the passed options (element directive)', function () {
163171
$compile('<ui-codemirror ui-codemirror-opts="{oof: \'baar\'}"></ui-codemirror>')(scope);
164172

165-
expect(codemirror.setOption).toHaveBeenCalled();
166-
expect(codemirror.setOption.calls.length).toEqual(1);
167-
expect(codemirror.setOption).toHaveBeenCalledWith('oof', 'baar');
173+
expect(window.CodeMirror).toHaveBeenCalledWith(jasmine.any(Function), angular.extend(codemirrorDefaults, { oof: 'baar' }));
174+
expect(codemirror.setOption).not.toHaveBeenCalled();
168175
});
169176

170177
it('should include the default options', function () {
171-
$compile('<div ui-codemirror>')(scope);
172178
uiConfig.codemirror = {bar: 'baz'};
173179
$compile('<div ui-codemirror></div>')(scope);
174180

175-
expect(codemirror.setOption).toHaveBeenCalled();
176-
expect(codemirror.setOption.calls.length).toEqual(1);
177-
expect(codemirror.setOption).toHaveBeenCalledWith('bar', 'baz');
181+
expect(window.CodeMirror).toHaveBeenCalledWith(jasmine.any(Function), angular.extend(codemirrorDefaults, { bar: 'baz' }));
182+
expect(codemirror.setOption).not.toHaveBeenCalled();
178183
});
179184

180185
it('should extent the default options', function () {
181-
$compile('<div ui-codemirror>')(scope);
182186
uiConfig.codemirror = {bar: 'baz'};
183187
$compile('<div ui-codemirror="{oof: \'baar\'}"></div>')(scope);
184188

185-
expect(codemirror.setOption).toHaveBeenCalled();
186-
expect(codemirror.setOption.calls.length).toEqual(2);
187-
expect(codemirror.setOption).toHaveBeenCalledWith('oof', 'baar');
188-
expect(codemirror.setOption).toHaveBeenCalledWith('bar', 'baz');
189+
expect(window.CodeMirror).toHaveBeenCalledWith(jasmine.any(Function), angular.extend(codemirrorDefaults, { oof: 'baar' , bar: 'baz' }));
190+
expect(codemirror.setOption).not.toHaveBeenCalled();
189191
});
190192

191193
it('should impact codemirror', function () {
192-
$compile('<div ui-codemirror>')(scope);
193194
uiConfig.codemirror = {};
194195
$compile('<div ui-codemirror="{theme: \'baar\'}"></div>')(scope);
195-
expect(codemirror.setOption).toHaveBeenCalled();
196-
expect(codemirror.setOption.calls.length).toEqual(1);
197-
expect(codemirror.setOption).toHaveBeenCalledWith('theme', 'baar');
198196

197+
expect(window.CodeMirror).toHaveBeenCalledWith(jasmine.any(Function), angular.extend(codemirrorDefaults, { theme: 'baar' }));
198+
expect(codemirror.setOption).not.toHaveBeenCalled();
199199

200200
expect(codemirror.getOption('theme')).toEqual('baar');
201201
});
@@ -283,8 +283,7 @@ describe('uiCodemirror', function () {
283283
});
284284

285285
it('should runs the onLoad callback', function () {
286-
scope.codemirrorLoaded = angular.noop;
287-
spyOn(scope, 'codemirrorLoaded');
286+
scope.codemirrorLoaded = jasmine.createSpy('scope.codemirrorLoaded');
288287

289288
$compile('<div ui-codemirror="{onLoad: codemirrorLoaded}"></div>')(scope);
290289

@@ -293,8 +292,8 @@ describe('uiCodemirror', function () {
293292
});
294293

295294
it('responds to the $broadcast event "CodeMirror"', function () {
296-
var broadcast = { callback: angular.noop };
297-
spyOn(broadcast, 'callback');
295+
var broadcast = { };
296+
broadcast.callback = jasmine.createSpy('broadcast.callback');
298297

299298
$compile('<div ui-codemirror></div>')(scope);
300299
scope.$broadcast('CodeMirror', broadcast.callback);
@@ -305,13 +304,11 @@ describe('uiCodemirror', function () {
305304

306305

307306
it('should watch the options', function () {
308-
spyOn(scope, '$watch').andCallThrough();
309307

310308
scope.cmOption = { readOnly: true };
311309
$compile('<div ui-codemirror="cmOption"></div>')(scope);
310+
scope.$digest();
312311

313-
expect(scope.$watch.callCount).toEqual(1); // the uiCodemirror option
314-
expect(scope.$watch).toHaveBeenCalledWith('cmOption', jasmine.any(Function), true);
315312
expect(codemirror.getOption('readOnly')).toBeTruthy();
316313

317314
scope.cmOption.readOnly = false;
@@ -320,14 +317,12 @@ describe('uiCodemirror', function () {
320317
});
321318

322319
it('should watch the options (object property)', function () {
323-
spyOn(scope, '$watch').andCallThrough();
324320

325321
scope.cm = {};
326322
scope.cm.option = { readOnly: true };
327323
$compile('<div ui-codemirror="cm.option"></div>')(scope);
324+
scope.$digest();
328325

329-
expect(scope.$watch.callCount).toEqual(1); // the uiCodemirror option
330-
expect(scope.$watch).toHaveBeenCalledWith('cm.option', jasmine.any(Function), true);
331326
expect(codemirror.getOption('readOnly')).toBeTruthy();
332327

333328
scope.cm.option.readOnly = false;

0 commit comments

Comments
 (0)