Add router to frontend
This commit is contained in:
parent
2d1e678aa6
commit
dc988e0faa
@ -28,7 +28,7 @@
|
|||||||
"maxdepth": 4,
|
"maxdepth": 4,
|
||||||
"maxerr": 50,
|
"maxerr": 50,
|
||||||
"maxlen": 80,
|
"maxlen": 80,
|
||||||
"maxparams": 4,
|
"maxparams": 5,
|
||||||
|
|
||||||
"indent": 2,
|
"indent": 2,
|
||||||
"globals": {
|
"globals": {
|
||||||
|
|||||||
@ -1,8 +1,10 @@
|
|||||||
define([
|
define([
|
||||||
'underscore',
|
'underscore',
|
||||||
|
'backbone',
|
||||||
'marionette',
|
'marionette',
|
||||||
'core/layout/module'
|
'core/layout/module',
|
||||||
], function AppDefine(_, Marionette, Layout) {
|
'core/router'
|
||||||
|
], function AppDefine(_, Backbone, Marionette, Layout, Router) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var Application = Marionette.Application;
|
var Application = Marionette.Application;
|
||||||
@ -15,15 +17,19 @@ define([
|
|||||||
}
|
}
|
||||||
|
|
||||||
App.prototype = new Application();
|
App.prototype = new Application();
|
||||||
|
|
||||||
_.extend(App.prototype, {
|
_.extend(App.prototype, {
|
||||||
Layout: Layout,
|
Layout: Layout,
|
||||||
|
|
||||||
initialize: function initialize(config) {
|
initialize: function initialize(config) {
|
||||||
config = config || {};
|
config = config || {};
|
||||||
if (config.Layout) {
|
this.Layout = config.Layout || this.Layout;
|
||||||
this.Layout = config.Layout;
|
|
||||||
}
|
|
||||||
this.module('layout', this.Layout);
|
this.module('layout', this.Layout);
|
||||||
|
|
||||||
|
this.router = new Router();
|
||||||
|
this.listenTo(this.router.model, 'change:slide', function (model, num) {
|
||||||
|
this.triggerMethod('slide:change', num);
|
||||||
|
}, this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ define([
|
|||||||
Model: LayoutModel,
|
Model: LayoutModel,
|
||||||
View: LayoutView,
|
View: LayoutView,
|
||||||
|
|
||||||
onStart: function(options) {
|
onStart: function onStart(options) {
|
||||||
var opts = _.defaults({}, options || {}, {layout: {}});
|
var opts = _.defaults({}, options || {}, {layout: {}});
|
||||||
_.defaults(opts.layout, {view: {}, model: {}});
|
_.defaults(opts.layout, {view: {}, model: {}});
|
||||||
|
|
||||||
|
|||||||
18
assets/app/core/model.js
Normal file
18
assets/app/core/model.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
define([
|
||||||
|
'underscore',
|
||||||
|
'backbone',
|
||||||
|
'marionette'
|
||||||
|
], function (_, Backbone, Marionette) {
|
||||||
|
var Obj = Marionette.Object;
|
||||||
|
var Model = Backbone.Model;
|
||||||
|
|
||||||
|
function BaseModel() {
|
||||||
|
Model.apply(this, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseModel.prototype = new Model();
|
||||||
|
|
||||||
|
_.extend(BaseModel.prototype, Obj.prototype);
|
||||||
|
|
||||||
|
return BaseModel;
|
||||||
|
});
|
||||||
29
assets/app/core/router.js
Normal file
29
assets/app/core/router.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
define(['underscore', 'backbone', 'core/model'], function (_, Backbone, Model) {
|
||||||
|
var Router = Backbone.Router;
|
||||||
|
|
||||||
|
function DeckRouter() {
|
||||||
|
Router.apply(this, arguments);
|
||||||
|
}
|
||||||
|
|
||||||
|
DeckRouter.prototype = new Router();
|
||||||
|
|
||||||
|
_.extend(DeckRouter.prototype, {
|
||||||
|
Model: Model,
|
||||||
|
model: null,
|
||||||
|
|
||||||
|
routes: {
|
||||||
|
'slide/:id': 'slide'
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function initialize(config) {
|
||||||
|
config = config || {};
|
||||||
|
this.model = config.model || new this.Model();
|
||||||
|
},
|
||||||
|
|
||||||
|
slide: function slide(id) {
|
||||||
|
this.model.set('slide', parseInt(id, 10));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return DeckRouter;
|
||||||
|
});
|
||||||
@ -1,10 +1,23 @@
|
|||||||
define('main', ['underscore', 'config', 'app'], function main(_, config, App) {
|
define('main', [
|
||||||
|
'underscore',
|
||||||
|
'backbone',
|
||||||
|
'config',
|
||||||
|
'app'
|
||||||
|
], function main(_, Backbone, config, App) {
|
||||||
'use strict';
|
'use strict';
|
||||||
requirejs.config(config());
|
requirejs.config(config());
|
||||||
return function main(options) {
|
return function main(options) {
|
||||||
var opts = _.defaults({}, options, {config: {}});
|
var opts = _.defaults({}, options, {config: {}});
|
||||||
var app = new App(opts);
|
var app = new App(opts);
|
||||||
|
|
||||||
|
app.on('start', function () {
|
||||||
|
if (!Backbone.history.start({pushState: true})) {
|
||||||
|
app.router.navigate('slide/1');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
app.start(opts.config);
|
app.start(opts.config);
|
||||||
|
|
||||||
return app;
|
return app;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
11
bin/deck
11
bin/deck
@ -34,7 +34,7 @@ function pathToFile() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
app.get('/', function index(req, res) {
|
function index(req, res) {
|
||||||
var indexFile = pathToFile('assets', 'index.html');
|
var indexFile = pathToFile('assets', 'index.html');
|
||||||
|
|
||||||
function compileServe(err, text) {
|
function compileServe(err, text) {
|
||||||
@ -47,7 +47,9 @@ app.get('/', function index(req, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fs.readFile(indexFile, {encoding: 'utf8'}, compileServe);
|
fs.readFile(indexFile, {encoding: 'utf8'}, compileServe);
|
||||||
});
|
}
|
||||||
|
|
||||||
|
app.get('/', index);
|
||||||
|
|
||||||
function serveIfExists(path) {
|
function serveIfExists(path) {
|
||||||
return function _serveIfExists(cb) {
|
return function _serveIfExists(cb) {
|
||||||
@ -98,6 +100,11 @@ app.get('/slides', function showHandler(req, res) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.get(/slide\/(\d+)/, function showHandler(req, res, next) {
|
app.get(/slide\/(\d+)/, function showHandler(req, res, next) {
|
||||||
|
if (!req.xhr) {
|
||||||
|
index(req, res);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var slideId = req.params[0];
|
var slideId = req.params[0];
|
||||||
var slidePath = pathToFile('data', 'slide', slideId + '.json');
|
var slidePath = pathToFile('data', 'slide', slideId + '.json');
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
define(['marionette', 'app'], function (Marionette, App) {
|
define(['backbone', 'marionette', 'app'], function (Backbone, Marionette, App) {
|
||||||
describe('App', function () {
|
describe('App', function () {
|
||||||
it('→ exits', function () {
|
it('→ exits', function () {
|
||||||
expect(new App()).not.toBeUndefined();
|
expect(new App()).not.toBeUndefined();
|
||||||
@ -18,5 +18,21 @@ define(['marionette', 'app'], function (Marionette, App) {
|
|||||||
expect(new App().layout).not.toBeUndefined();
|
expect(new App().layout).not.toBeUndefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('→ has router', function () {
|
||||||
|
it('→ exits', function () {
|
||||||
|
expect(new App().router).not.toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('→ listens to events', function () {
|
||||||
|
it('→ exits', function () {
|
||||||
|
var app = new App();
|
||||||
|
app.onSlideChange = app.onSlideChange || function () {};
|
||||||
|
spyOn(app, 'onSlideChange');
|
||||||
|
app.router.model.set('slide', 123);
|
||||||
|
expect(app.onSlideChange).toHaveBeenCalledWith(123);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
13
test/app/core/model.js
Normal file
13
test/app/core/model.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
define(['core/model'], function (Model) {
|
||||||
|
describe('Model', function () {
|
||||||
|
it('→ exits', function () {
|
||||||
|
expect(new Model()).not.toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('→ triggerMethod', function () {
|
||||||
|
it('→ exits', function () {
|
||||||
|
expect((new Model()).triggerMethod).not.toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
26
test/app/core/router.js
Normal file
26
test/app/core/router.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
define(['backbone', 'core/router'], function (Backbone, Router) {
|
||||||
|
describe('Router', function () {
|
||||||
|
it('→ exits', function () {
|
||||||
|
expect(new Router()).not.toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('→ is passed model', function () {
|
||||||
|
it('→ exits', function () {
|
||||||
|
expect((new Router()).model).not.toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('→ same as passed in', function () {
|
||||||
|
var model = new Backbone.Model();
|
||||||
|
expect((new Router({model: model})).model).toBe(model);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('→ navigate changes model', function () {
|
||||||
|
it('→ goes to the number for page', function () {
|
||||||
|
var router = new Router();
|
||||||
|
router.slide('123');
|
||||||
|
expect(router.model.get('slide')).toBe(123);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Loading…
Reference in New Issue
Block a user