Skip to content

Commit a1ed9ad

Browse files
committed
Remove ObjectController proxying behavior.
Ember.ObjectController (and Ember.ArrayController) will be deprecated in Ember 1.11 (and removed from core in Ember 2.0). The reasoning is detailed in the Ember 2.0 RFC. This PR does the following: * Updates templates/controllers/views to explicitly reference model properties (instead of relying on proxying behavior). * Clearly delineate where certain properties are being set or retrieved from (for example it was not clear exactly where `scratch` and `titleScratch` were stored). * Remove usage of `Ember.ObjectController`. * Add JSCS rule to prevent future PR's from adding regressions.
1 parent 25d90c0 commit a1ed9ad

38 files changed

+219
-170
lines changed

.jscsrc

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"additionalRules": [ "core/test/utils/jscs-rules/*.js" ],
23
"requireCurlyBraces": [
34
"if",
45
"else",

Gruntfile.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,15 @@ var _ = require('lodash'),
203203
client: {
204204
options: {
205205
config: '.jscsrc',
206-
esnext: true
206+
esnext: true,
207+
disallowObjectController: true
207208
}
208209
},
209210
clientTests: {
210211
options: {
211212
config: '.jscsrc',
212-
esnext: true
213+
esnext: true,
214+
disallowObjectController: true
213215
}
214216
},
215217
test: {
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import EditorControllerMixin from 'ghost/mixins/editor-base-controller';
22

3-
var EditorEditController = Ember.ObjectController.extend(EditorControllerMixin);
3+
var EditorEditController = Ember.Controller.extend(EditorControllerMixin);
44

55
export default EditorEditController;

core/client/controllers/editor/new.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import EditorControllerMixin from 'ghost/mixins/editor-base-controller';
22

3-
var EditorNewController = Ember.ObjectController.extend(EditorControllerMixin, {
3+
var EditorNewController = Ember.Controller.extend(EditorControllerMixin, {
44
actions: {
55
/**
66
* Redirect to editor after the first save

core/client/controllers/modals/delete-tag.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
var DeleteTagController = Ember.ObjectController.extend({
2-
postInflection: Ember.computed('post_count', function () {
3-
return this.get('post_count') > 1 ? 'posts' : 'post';
1+
var DeleteTagController = Ember.Controller.extend({
2+
postInflection: Ember.computed('model.post_count', function () {
3+
return this.get('model.post_count') > 1 ? 'posts' : 'post';
44
}),
55

66
actions: {

core/client/controllers/modals/delete-user.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
var DeleteUserController = Ember.ObjectController.extend({
2-
userPostCount: Ember.computed('id', function () {
1+
var DeleteUserController = Ember.Controller.extend({
2+
userPostCount: Ember.computed('model.id', function () {
33
var promise,
44
query = {
5-
author: this.get('slug'),
5+
author: this.get('model.slug'),
66
status: 'all'
77
};
88

core/client/controllers/post-settings-menu.js

+47-45
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,23 @@ import SlugGenerator from 'ghost/models/slug-generator';
55
import boundOneWay from 'ghost/utils/bound-one-way';
66
import isNumber from 'ghost/utils/isNumber';
77

8-
var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin, {
8+
var PostSettingsMenuController = Ember.Controller.extend(SettingsMenuMixin, {
9+
debounceId: null,
910
lastPromise: null,
10-
1111
selectedAuthor: null,
12+
uploaderReference: null,
13+
1214
initializeSelectedAuthor: function () {
1315
var self = this;
1416

15-
return this.get('author').then(function (author) {
17+
return this.get('model.author').then(function (author) {
1618
self.set('selectedAuthor', author);
1719
return author;
1820
});
1921
}.observes('model'),
2022

2123
changeAuthor: function () {
22-
var author = this.get('author'),
24+
var author = this.get('model.author'),
2325
selectedAuthor = this.get('selectedAuthor'),
2426
model = this.get('model'),
2527
self = this;
@@ -32,7 +34,7 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
3234
model.set('author', selectedAuthor);
3335

3436
// if this is a new post (never been saved before), don't try to save it
35-
if (this.get('isNew')) {
37+
if (this.get('model.isNew')) {
3638
return;
3739
}
3840

@@ -61,8 +63,8 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
6163
}),
6264

6365
/*jshint unused:false */
64-
publishedAtValue: Ember.computed('published_at', function (key, value) {
65-
var pubDate = this.get('published_at');
66+
publishedAtValue: Ember.computed('model.published_at', function (key, value) {
67+
var pubDate = this.get('model.published_at');
6668

6769
// We're using a fake setter to reset
6870
// the cache for this property
@@ -78,7 +80,7 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
7880
}),
7981
/*jshint unused:true */
8082

81-
slugValue: boundOneWay('slug'),
83+
slugValue: boundOneWay('model.slug'),
8284

8385
// Lazy load the slug generator
8486
slugGenerator: Ember.computed(function () {
@@ -91,12 +93,12 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
9193
// Requests slug from title
9294
generateAndSetSlug: function (destination) {
9395
var self = this,
94-
title = this.get('titleScratch'),
96+
title = this.get('model.titleScratch'),
9597
afterSave = this.get('lastPromise'),
9698
promise;
9799

98100
// Only set an "untitled" slug once per post
99-
if (title === '(Untitled)' && this.get('slug')) {
101+
if (title === '(Untitled)' && this.get('model.slug')) {
100102
return;
101103
}
102104

@@ -113,13 +115,13 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
113115
this.set('lastPromise', promise);
114116
},
115117

116-
metaTitleScratch: boundOneWay('meta_title'),
117-
metaDescriptionScratch: boundOneWay('meta_description'),
118+
metaTitleScratch: boundOneWay('model.meta_title'),
119+
metaDescriptionScratch: boundOneWay('model.meta_description'),
118120

119-
seoTitle: Ember.computed('titleScratch', 'metaTitleScratch', function () {
121+
seoTitle: Ember.computed('model.titleScratch', 'metaTitleScratch', function () {
120122
var metaTitle = this.get('metaTitleScratch') || '';
121123

122-
metaTitle = metaTitle.length > 0 ? metaTitle : this.get('titleScratch');
124+
metaTitle = metaTitle.length > 0 ? metaTitle : this.get('model.titleScratch');
123125

124126
if (metaTitle.length > 70) {
125127
metaTitle = metaTitle.substring(0, 70).trim();
@@ -130,7 +132,7 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
130132
return metaTitle;
131133
}),
132134

133-
seoDescription: Ember.computed('scratch', 'metaDescriptionScratch', function () {
135+
seoDescription: Ember.computed('model.scratch', 'metaDescriptionScratch', function () {
134136
var metaDescription = this.get('metaDescriptionScratch') || '',
135137
el,
136138
html = '',
@@ -166,9 +168,9 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
166168
return placeholder;
167169
}),
168170

169-
seoURL: Ember.computed('slug', function () {
171+
seoURL: Ember.computed('model.slug', function () {
170172
var blogUrl = this.get('config').blogUrl,
171-
seoSlug = this.get('slug') ? this.get('slug') : '',
173+
seoSlug = this.get('model.slug') ? this.get('model.slug') : '',
172174
seoURL = blogUrl + '/' + seoSlug;
173175

174176
// only append a slash to the URL if the slug exists
@@ -187,18 +189,18 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
187189
// observe titleScratch, keeping the post's slug in sync
188190
// with it until saved for the first time.
189191
addTitleObserver: function () {
190-
if (this.get('isNew') || this.get('title') === '(Untitled)') {
191-
this.addObserver('titleScratch', this, 'titleObserver');
192+
if (this.get('model.isNew') || this.get('model.title') === '(Untitled)') {
193+
this.addObserver('model.titleScratch', this, 'titleObserver');
192194
}
193195
}.observes('model'),
194196

195197
titleObserver: function () {
196198
var debounceId,
197-
title = this.get('title');
199+
title = this.get('model.title');
198200

199201
// generate a slug if a post is new and doesn't have a title yet or
200202
// if the title is still '(Untitled)' and the slug is unaltered.
201-
if ((this.get('isNew') && !title) || title === '(Untitled)') {
203+
if ((this.get('model.isNew') && !title) || title === '(Untitled)') {
202204
debounceId = Ember.run.debounce(this, 'generateAndSetSlug', ['slug'], 700);
203205
}
204206

@@ -218,10 +220,10 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
218220
togglePage: function () {
219221
var self = this;
220222

221-
this.toggleProperty('page');
223+
this.toggleProperty('model.page');
222224
// If this is a new post. Don't save the model. Defer the save
223225
// to the user pressing the save button
224-
if (this.get('isNew')) {
226+
if (this.get('model.isNew')) {
225227
return;
226228
}
227229

@@ -234,11 +236,11 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
234236
toggleFeatured: function () {
235237
var self = this;
236238

237-
this.toggleProperty('featured');
239+
this.toggleProperty('model.featured');
238240

239241
// If this is a new post. Don't save the model. Defer the save
240242
// to the user pressing the save button
241-
if (this.get('isNew')) {
243+
if (this.get('model.isNew')) {
242244
return;
243245
}
244246

@@ -252,7 +254,7 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
252254
* triggered by user manually changing slug
253255
*/
254256
updateSlug: function (newSlug) {
255-
var slug = this.get('slug'),
257+
var slug = this.get('model.slug'),
256258
self = this;
257259

258260
newSlug = newSlug || slug;
@@ -294,15 +296,15 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
294296
}
295297
}
296298

297-
self.set('slug', serverSlug);
299+
self.set('model.slug', serverSlug);
298300

299-
if (self.hasObserverFor('titleScratch')) {
300-
self.removeObserver('titleScratch', self, 'titleObserver');
301+
if (self.hasObserverFor('model.titleScratch')) {
302+
self.removeObserver('model.titleScratch', self, 'titleObserver');
301303
}
302304

303305
// If this is a new post. Don't save the model. Defer the save
304306
// to the user pressing the save button
305-
if (self.get('isNew')) {
307+
if (self.get('model.isNew')) {
306308
return;
307309
}
308310

@@ -321,13 +323,13 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
321323
setPublishedAt: function (userInput) {
322324
var errMessage = '',
323325
newPublishedAt = parseDateString(userInput),
324-
publishedAt = this.get('published_at'),
326+
publishedAt = this.get('model.published_at'),
325327
self = this;
326328

327329
if (!userInput) {
328330
// Clear out the published_at field for a draft
329-
if (this.get('isDraft')) {
330-
this.set('published_at', null);
331+
if (this.get('model.isDraft')) {
332+
this.set('model.published_at', null);
331333
}
332334

333335
return;
@@ -355,11 +357,11 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
355357
}
356358

357359
// Validation complete
358-
this.set('published_at', newPublishedAt);
360+
this.set('model.published_at', newPublishedAt);
359361

360362
// If this is a new post. Don't save the model. Defer the save
361363
// to the user pressing the save button
362-
if (this.get('isNew')) {
364+
if (this.get('model.isNew')) {
363365
return;
364366
}
365367

@@ -371,18 +373,18 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
371373

372374
setMetaTitle: function (metaTitle) {
373375
var self = this,
374-
currentTitle = this.get('meta_title') || '';
376+
currentTitle = this.get('model.meta_title') || '';
375377

376378
// Only update if the title has changed
377379
if (currentTitle === metaTitle) {
378380
return;
379381
}
380382

381-
this.set('meta_title', metaTitle);
383+
this.set('model.meta_title', metaTitle);
382384

383385
// If this is a new post. Don't save the model. Defer the save
384386
// to the user pressing the save button
385-
if (this.get('isNew')) {
387+
if (this.get('model.isNew')) {
386388
return;
387389
}
388390

@@ -393,18 +395,18 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
393395

394396
setMetaDescription: function (metaDescription) {
395397
var self = this,
396-
currentDescription = this.get('meta_description') || '';
398+
currentDescription = this.get('model.meta_description') || '';
397399

398400
// Only update if the description has changed
399401
if (currentDescription === metaDescription) {
400402
return;
401403
}
402404

403-
this.set('meta_description', metaDescription);
405+
this.set('model.meta_description', metaDescription);
404406

405407
// If this is a new post. Don't save the model. Defer the save
406408
// to the user pressing the save button
407-
if (this.get('isNew')) {
409+
if (this.get('model.isNew')) {
408410
return;
409411
}
410412

@@ -416,9 +418,9 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
416418
setCoverImage: function (image) {
417419
var self = this;
418420

419-
this.set('image', image);
421+
this.set('model.image', image);
420422

421-
if (this.get('isNew')) {
423+
if (this.get('model.isNew')) {
422424
return;
423425
}
424426

@@ -431,9 +433,9 @@ var PostSettingsMenuController = Ember.ObjectController.extend(SettingsMenuMixin
431433
clearCoverImage: function () {
432434
var self = this;
433435

434-
this.set('image', '');
436+
this.set('model.image', '');
435437

436-
if (this.get('isNew')) {
438+
if (this.get('model.isNew')) {
437439
return;
438440
}
439441

core/client/controllers/post-tags-input.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
var PostTagsInputController = Ember.Controller.extend({
22
tagEnteredOrder: Ember.A(),
33

4-
tags: Ember.computed('parentController.tags', function () {
4+
tags: Ember.computed('parentController.model.tags', function () {
55
var proxyTags = Ember.ArrayProxy.create({
6-
content: this.get('parentController.tags')
6+
content: this.get('parentController.model.tags')
77
}),
88
temp = proxyTags.get('arrangedContent').slice();
99

core/client/controllers/posts/post.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
var PostController = Ember.ObjectController.extend({
2-
isPublished: Ember.computed.equal('status', 'published'),
3-
classNameBindings: ['featured'],
1+
var PostController = Ember.Controller.extend({
2+
isPublished: Ember.computed.equal('model.status', 'published'),
3+
classNameBindings: ['model.featured'],
44

55
actions: {
66
toggleFeatured: function () {
77
var options = {disableNProgress: true},
88
self = this;
99

10-
this.toggleProperty('featured');
10+
this.toggleProperty('model.featured');
1111
this.get('model').save(options).catch(function (errors) {
1212
self.notifications.showErrors(errors);
1313
});

core/client/controllers/settings/app.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ appStates = {
99
inactive: 'inactive'
1010
};
1111

12-
SettingsAppController = Ember.ObjectController.extend({
12+
SettingsAppController = Ember.Controller.extend({
1313
appState: appStates.active,
1414
buttonText: '',
1515

core/client/controllers/settings/code-injection.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var SettingsCodeInjectionController = Ember.ObjectController.extend({
1+
var SettingsCodeInjectionController = Ember.Controller.extend({
22
actions: {
33
save: function () {
44
var self = this;

0 commit comments

Comments
 (0)