route.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. (function (Misago) {
  2. 'use strict';
  3. var noop = function() {};
  4. Misago.route = function(component) {
  5. /*
  6. Boilerplate for Misago top-level components
  7. */
  8. // Component state
  9. component.isActive = true;
  10. // Wrap controller to store lifecycle methods
  11. var __controller = component.controller || noop;
  12. component.controller = function() {
  13. component.isActive = true;
  14. var controller = __controller.apply(component, arguments) || {};
  15. // wrap onunload for lifestate
  16. var __onunload = controller.onunload || noop;
  17. controller.onunload = function() {
  18. __onunload.apply(component, arguments);
  19. component.isActive = false;
  20. };
  21. return controller;
  22. };
  23. // Add state callbacks to View-Model
  24. if (component.vm && component.vm.init) {
  25. // wrap vm.init in promise handler
  26. var __init = component.vm.init;
  27. component.vm.init = function() {
  28. var initArgs = arguments;
  29. var promise = __init.apply(component.vm, initArgs);
  30. if (promise) {
  31. promise.then(function() {
  32. if (component.isActive && component.vm.ondata) {
  33. var finalArgs = [];
  34. for (var i = 0; i < arguments.length; i++) {
  35. finalArgs.push(arguments[i]);
  36. }
  37. for (var f = 0; f < initArgs.length; f++) {
  38. finalArgs.push(initArgs[f]);
  39. }
  40. component.vm.ondata.apply(component.vm, finalArgs);
  41. }
  42. }, function(error) {
  43. if (component.isActive) {
  44. component.container.router.errorPage(error);
  45. }
  46. });
  47. }
  48. };
  49. // setup default loading view
  50. if (!component.loading) {
  51. component.loading = function () {
  52. var _ = this.container;
  53. return m('.page.page-loading',
  54. _.component('loader')
  55. );
  56. };
  57. }
  58. var __view = component.view;
  59. component.view = function() {
  60. if (component.vm.isReady) {
  61. return __view.apply(component, arguments);
  62. } else {
  63. return component.loading.apply(component, arguments);
  64. }
  65. };
  66. }
  67. return component;
  68. };
  69. }(Misago.prototype));