From b61746809809f412bdb157c28a1e8c12e2ee3198 Mon Sep 17 00:00:00 2001 From: Robin Ward <robin.ward@gmail.com> Date: Mon, 13 Jan 2014 15:30:19 -0500 Subject: [PATCH] FIX: `currentPath` was not changing when transitioning to the same path. Added a new hook to allow other kinds of analytics. --- .../controllers/application_controller.js | 25 ---------------- .../discourse/initializers/page_tracking.js | 15 ++++++++++ .../javascripts/discourse/lib/page_tracker.js | 30 +++++++++++++++++++ 3 files changed, 45 insertions(+), 25 deletions(-) delete mode 100644 app/assets/javascripts/discourse/controllers/application_controller.js create mode 100644 app/assets/javascripts/discourse/initializers/page_tracking.js create mode 100644 app/assets/javascripts/discourse/lib/page_tracker.js diff --git a/app/assets/javascripts/discourse/controllers/application_controller.js b/app/assets/javascripts/discourse/controllers/application_controller.js deleted file mode 100644 index 1202464f7..000000000 --- a/app/assets/javascripts/discourse/controllers/application_controller.js +++ /dev/null @@ -1,25 +0,0 @@ -/*global _gaq:true */ - -/** - The base controller for all things Discourse - - @class ApplicationController - @extends Discourse.Controller - @namespace Discourse - @module Discourse -**/ -Discourse.ApplicationController = Discourse.Controller.extend({ - - routeChanged: function(){ - if (window._gaq === undefined) { return; } - - if(this.afterFirstHit) { - Em.run.schedule('afterRender', function() { - _gaq.push(['_trackPageview']); - }); - } else { - this.afterFirstHit = true; - } - }.observes('currentPath') - -}); diff --git a/app/assets/javascripts/discourse/initializers/page_tracking.js b/app/assets/javascripts/discourse/initializers/page_tracking.js new file mode 100644 index 000000000..6ed83dd8b --- /dev/null +++ b/app/assets/javascripts/discourse/initializers/page_tracking.js @@ -0,0 +1,15 @@ +/** + Sets up the PageTracking hook. +**/ +Discourse.addInitializer(function() { + var pageTracker = Discourse.PageTracker.current(); + pageTracker.start(); + + // Out of the box, Discourse tries to track google analytics + // if it is present + if (typeof window._gaq !== 'undefined') { + pageTracker.on('change', function() { + window._gaq.push(['_trackPageview']); + }); + } +}); diff --git a/app/assets/javascripts/discourse/lib/page_tracker.js b/app/assets/javascripts/discourse/lib/page_tracker.js new file mode 100644 index 000000000..d8a74a148 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/page_tracker.js @@ -0,0 +1,30 @@ +/** + Called whenever the "page" changes. This allows us to set up analytics + and other tracking. + + To get notified when the page changes, you can install a hook like so: + + ```javascript + Discourse.PageTracker.current().on('change', function(url) { + console.log('the page changed to: ' + url); + }); + ``` + + @class PageTracker + @namespace Discourse + @module Discourse +**/ +Discourse.PageTracker = Ember.Object.extend(Ember.Evented, { + start: function() { + if (this.get('started')) { return; } + + var router = Discourse.__container__.lookup('router:main'), + self = this; + + router.on('didTransition', function() { + self.trigger('change', this.get('url')); + }); + this.set('started', true); + } +}); +Discourse.PageTracker.reopenClass(Discourse.Singleton);