Remove Discourse.transient. Use a singleton for session data, it's a lot cleaner.

This commit is contained in:
Robin Ward 2013-07-26 14:59:28 -04:00
parent fca83cb185
commit 773823c41f
10 changed files with 88 additions and 43 deletions

View File

@ -10,9 +10,6 @@
Discourse = Ember.Application.createWithMixins({ Discourse = Ember.Application.createWithMixins({
rootElement: '#main', rootElement: '#main',
// Data we want to remember for a short period
transient: Em.Object.create(),
// Whether the app has focus or not // Whether the app has focus or not
hasFocus: true, hasFocus: true,
@ -69,8 +66,7 @@ Discourse = Ember.Application.createWithMixins({
}), }),
titleChanged: function() { titleChanged: function() {
var title; var title = "";
title = "";
if (this.get('title')) { if (this.get('title')) {
title += "" + (this.get('title')) + " - "; title += "" + (this.get('title')) + " - ";
} }

View File

@ -31,7 +31,7 @@ Discourse.LoadMore = Em.Mixin.create(Discourse.Scrolling, {
this.bindScrolling(); this.bindScrolling();
}, },
willRemoveElement: function() { willDestroyElement: function() {
this._super(); this._super();
this.unbindScrolling(); this.unbindScrolling();
} }

View File

@ -0,0 +1,35 @@
/**
A data model representing current session data. You can put transient
data here you might want later.
@class Session
@extends Discourse.Model
@namespace Discourse
@module Discourse
**/
Discourse.Session = Discourse.Model.extend({});
Discourse.Session.reopenClass({
/**
Returns the current session.
@method current
@returns {Discourse.Session} the current session singleton
**/
current: function(property, value) {
if (!this.currentSession) {
this.currentSession = Discourse.Session.create();
}
// If we found the current session
if (property) {
if (value) {
this.currentSession.set(property, value);
} else {
return this.currentSession.get(property);
}
}
return property ? this.currentSession.get(property) : this.currentSession;
}
});

View File

@ -45,7 +45,7 @@ Discourse.TopicList = Discourse.Model.extend({
}); });
topicList.set('more_topics_url', result.topic_list.more_topics_url); topicList.set('more_topics_url', result.topic_list.more_topics_url);
Discourse.set('transient.topicsList', topicList); Discourse.Session.current('topicList', topicList);
topicList.set('loadingMore', false); topicList.set('loadingMore', false);
return result.topic_list.more_topics_url; return result.topic_list.more_topics_url;
@ -60,8 +60,8 @@ Discourse.TopicList = Discourse.Model.extend({
// loads topics with these ids "before" the current topics // loads topics with these ids "before" the current topics
loadBefore: function(topic_ids){ loadBefore: function(topic_ids){
var _this = this; var topicList = this,
var topics = this.get('topics'); topics = this.get('topics');
// refresh dupes // refresh dupes
topics.removeObjects(topics.filter(function(topic){ topics.removeObjects(topics.filter(function(topic){
@ -70,13 +70,12 @@ Discourse.TopicList = Discourse.Model.extend({
Discourse.TopicList.loadTopics(topic_ids, this.get('filter')) Discourse.TopicList.loadTopics(topic_ids, this.get('filter'))
.then(function(newTopics){ .then(function(newTopics){
_this.forEachNew(newTopics, function(t) { topicList.forEachNew(newTopics, function(t) {
// highlight the first of the new topics so we can get a visual feedback // highlight the first of the new topics so we can get a visual feedback
t.set('highlight', true); t.set('highlight', true);
topics.insertAt(0,t); topics.insertAt(0,t);
}); });
Discourse.set('transient.topicsList', _this); Discourse.Session.current('topicList', topicList);
}); });
} }
}); });
@ -128,17 +127,17 @@ Discourse.TopicList.reopenClass({
list: function(menuItem) { list: function(menuItem) {
var filter = menuItem.get('name'); var filter = menuItem.get('name');
var list = Discourse.get('transient.topicsList'); var session = Discourse.Session.current();
var list = session.get('topicList');
if (list) { if (list) {
if ((list.get('filter') === filter) && window.location.pathname.indexOf('more') > 0) { if ((list.get('filter') === filter) && window.location.pathname.indexOf('more') > 0) {
list.set('loaded', true); list.set('loaded', true);
return Ember.Deferred.promise(function(promise) { return Ember.RSVP.resolve(list);
promise.resolve(list);
});
} }
} }
Discourse.set('transient.topicsList', null);
Discourse.set('transient.topicListScrollPos', null); session.set('topicList', null);
session.set('topicListScrollPos', null);
return Discourse.TopicList.find(filter, menuItem.get('excludeCategory')); return Discourse.TopicList.find(filter, menuItem.get('excludeCategory'));
} }

View File

@ -40,6 +40,14 @@ Discourse.FilteredListRoute = Discourse.Route.extend({
listController.set('category', null); listController.set('category', null);
listController.set('canCreateTopic', topicList.get('can_create_topic')); listController.set('canCreateTopic', topicList.get('can_create_topic'));
listTopicsController.set('model', topicList); listTopicsController.set('model', topicList);
var scrollPos = Discourse.Session.current('topicListScrollPosition');
if (scrollPos) {
Em.run.next(function() {
$('html, body').scrollTop(scrollPos);
});
Discourse.Session.current().set('topicListScrollPosition', null);
}
}); });
} }
}); });

View File

@ -71,9 +71,7 @@ Discourse.TopicRoute = Discourse.Route.extend({
this._super(); this._super();
var topic = this.modelFor('topic'); var topic = this.modelFor('topic');
Discourse.set('transient.lastTopicIdViewed', parseInt(topic.get('id'), 10)); Discourse.Session.current('lastTopicIdViewed', parseInt(topic.get('id'), 10));
// Set the search context
this.controllerFor('search').set('searchContext', topic.get('searchContext')); this.controllerFor('search').set('searchContext', topic.get('searchContext'));
}, },

View File

@ -162,7 +162,6 @@ Discourse.UserPrivateMessagesSentRoute = Discourse.UserActivityStreamRoute.exten
userActionType: Discourse.UserAction.TYPES.messages_sent userActionType: Discourse.UserAction.TYPES.messages_sent
}); });
//Discourse.UserTopicsListView = Em.View.extend({ templateName: 'user/topics_list' });
Discourse.UserTopicListRoute = Discourse.Route.extend({ Discourse.UserTopicListRoute = Discourse.Route.extend({
renderTemplate: function() { renderTemplate: function() {

View File

@ -22,16 +22,9 @@ Discourse.ListTopicsView = Discourse.View.extend(Discourse.LoadMore, {
didInsertElement: function() { didInsertElement: function() {
this._super(); this._super();
var scrollPos = Discourse.get('transient.topicListScrollPos');
if (scrollPos) {
Em.run.schedule('afterRender', function() {
$('html, body').scrollTop(scrollPos);
});
} else {
Em.run.schedule('afterRender', function() { Em.run.schedule('afterRender', function() {
$('html, body').scrollTop(0); $('html, body').scrollTop(0);
}); });
}
}, },
hasTopics: Em.computed.gt('list.topics.length', 0), hasTopics: Em.computed.gt('list.topics.length', 0),
@ -46,7 +39,7 @@ Discourse.ListTopicsView = Discourse.View.extend(Discourse.LoadMore, {
Discourse.notifyTitle(0); Discourse.notifyTitle(0);
listTopicsView.get('controller').loadMore().then(function (hasMoreResults) { listTopicsView.get('controller').loadMore().then(function (hasMoreResults) {
Em.run.schedule('afterRender', function() { Em.run.schedule('afterRender', function() {
listTopicsView.saveScrollPos(); listTopicsView.saveScrollPosition();
}); });
if (!hasMoreResults) { if (!hasMoreResults) {
listTopicsView.get('eyeline').flushRest(); listTopicsView.get('eyeline').flushRest();
@ -55,14 +48,14 @@ Discourse.ListTopicsView = Discourse.View.extend(Discourse.LoadMore, {
}, },
// Remember where we were scrolled to // Remember where we were scrolled to
saveScrollPos: function() { saveScrollPosition: function() {
return Discourse.set('transient.topicListScrollPos', $(window).scrollTop()); Discourse.Session.current('topicListScrollPosition', $(window).scrollTop());
}, },
// When the topic list is scrolled // When the topic list is scrolled
scrolled: function(e) { scrolled: function(e) {
this._super(); this._super();
this.saveScrollPos(); this.saveScrollPosition();
} }

View File

@ -16,7 +16,7 @@ Discourse.TopicListItemView = Discourse.View.extend({
init: function() { init: function() {
this._super(); this._super();
return this.set('context', this.get('content')); this.set('context', this.get('content'));
}, },
highlight: function() { highlight: function() {
@ -30,13 +30,14 @@ Discourse.TopicListItemView = Discourse.View.extend({
}, },
didInsertElement: function() { didInsertElement: function() {
// highligth the last topic viewed var session = Discourse.Session.current();
if (Discourse.get('transient.lastTopicIdViewed') === this.get('content.id')) {
Discourse.set('transient.lastTopicIdViewed', null); // // highligth the last topic viewed
if (session.get('lastTopicIdViewed') === this.get('content.id')) {
session.set('lastTopicIdViewed', null);
this.highlight(); this.highlight();
} } else if (this.get('content.highlight')) {
// highlight new topics that have been loaded from the server or the one we just created // highlight new topics that have been loaded from the server or the one we just created
else if (this.get('content.highlight')) {
this.set('content.highlight', false); this.set('content.highlight', false);
this.highlight(); this.highlight();
} }

View File

@ -0,0 +1,16 @@
module("Discourse.Session");
test('current', function(){
var session = Discourse.Session.current();
present(session, "We have a current site session");
equal(session, Discourse.Session.current(), "Calling it a second time returns the same instance");
blank(Discourse.Session.current('orange'), "by default properties are nil");
session.set('orange', 'newBlack');
equal(Discourse.Session.current('orange'), "newBlack", "it remembers values");
Discourse.Session.current('orange', 'juice');
equal(session.get('orange'), "juice", "it can be updated");
});