marclundgren
4/27/2014 - 1:01 PM

Mithril Dependency Injector #.editorconfig

Mithril Dependency Injector #.editorconfig

// Example

// app.js
document.addEventListener("DOMContentLoaded", function (e) {
  m.route.mode = "hash";
  m.route(document.getElementById("application"), "/", {
    "/": m.resolve("pages.home"),
    "/findus": m.resolve("pages.findus")
  });
});

// pages/home.js
m.factory("pages.home", ["components.layout", function (layout) {
  return {
    "controller": function () {
      this.title = "Home";

      return this;
    },
    "view": function (c) {
      return layout("This is my page text at: " + c.title);
    }
  };
}]);

// pages/findus.js
m.factory("pages.findus", ["components.layout", function (layout) {
  return {
    "controller": function () {
      this.title = "Find us";

      return this;
    },
    "view": function (c) {
      return layout("This is page text at: " + c.title);
    }
  };
}]);

// components/layout.js
m.factory("conponents.layout", ["components.nav", function (nav) {
  return function (text) {
    return [
      nav(),
      text
    ];
  };
}]);

// components/nav.js
m.factory("components.nav", ["application.config", "helpers.icon", function (cfg, icon) {
  return function () {
    return m("ul", cfg.nav.map(function (link) {
      return m("li", [
        m("a[href='"+link.href+"']", [
          icon(link.icon), link.title
        ])
      ]);
    }));
  };
}]);

// helpers/icon.js
m.factory("helpers.icon", ["application.config", function (cfg) {
  var icon = "";

  switch (cfg.iconset) {
    case "bootstrap":
      icon = "span.glyphicon.glyphicon-";
      break;
    case "fontawesome":
      icon = "i.fa.fa-";
      break;
  }

  return function (type) {
    return m(icon + type);
  };
}]);

// config.js
m.factory("application.config", function () {
  return {
    "debug": true,
    "iconset": "fontawesome",
    "nav": [
      {"title": "Home", "href": "#/", "icon": "home"},
      {"title": "Find us", "href": "#/findus", "icon": "map-marker"},
    ]
  };
});
(function (m) {
  var repository = {};

  m.factory = function (name, dependencies) {
    if (typeof repository[name] !== "undefined") {
      throw new Error("Duplicate dependency entry");
    } else if (typeof dependencies === "undefined") {
      throw new Error("Empty dependency list");
    }

    repository[name] = {
      fn           : typeof dependencies === "function" ? dependencies : dependencies.pop() || null,
      dependencies : Array.isArray(dependencies) ? dependencies || null : null,
      instance     : null
    };

    if (repository[name].fn === null) {
      throw new Error("Empty repository entry");
    } else if (typeof repository[name].fn !== "function") {
      throw new Error("Dependency not a function");
    }
  };

  m.resolve = function (name, params, scope) {
    var resolved;

    if (typeof repository[name] === "undefined") {
      throw new Error("Undefined dependency resolve: " + name);
    }

    if (repository[name].instance === null) {
      resolved = [];

      if (repository[name].dependencies !== null) {
        repository[name].dependencies.forEach(function(dependency) {
          return resolved.push(m.resolve(dependency));
        });
      }

      repository[name].instance = repository[name].fn.apply(scope || {}, resolved.concat(Array.prototype.slice.resolve(params || [], 0)));
    }
    
    return repository[name].instance;
  };
})(Mithril);