VNDB fork of mithril.js
Find a file
Matt Tracy 1cdb66b20d Typescript: Support for Parameterized Components
Previously, the Typescript definition file did not support parameterized
components. The `component()` function did accept additional arguments, but the
`MithrilComponent<T>` interface did not allow components to have any additional
arguments in either their `controller()` or `view()` methods.

Properly supporting flexible variadic parameters in typescript is somewhat
challenging. Tuple types are close, but would only work if the signature of
`controller` and `view` accepted arrays of arguments:
```
interface MithrilStatic {
  component<TController extend controller, TRest extends any[]>(
    component: ParameterizedMithrilComponent<TController, TRest>,
    ...args:TRest
  ) : TController
}

interface ParameterizedMithrilComponent<TController extend controller, TRest
extends any[]> {
  // Doesn't match mithril's component interface; we want to unpack the contents
  // of TRest
  controller: (args: TRest) => TController,
  view: (ctrl: TController, args: TRest)
}
```

Therefore, I have gone with a more traditional method of defining several
overloads of m.component(), each with a different number of extra parameters.
Because of this, the first four parameters to m.component() will be correctly
type checked (i.e. if the Component's controller defines the parameter, it must
be supplied to m.component). Additional parameters beyond the first four are
allowed, but are caught via an `...args:any[]` and thus are not type checked.
2015-09-30 16:44:45 -04:00
deploy #518 fix package.json file for cdn.js 2015-03-30 14:54:20 -04:00
docs fix file size in docs 2015-09-28 22:26:41 -04:00
tests Make m.route.param() return all params #737 2015-08-18 20:44:58 +02:00
.editorconfig tweak editorconfig preferences 2015-04-22 21:00:11 -04:00
.gitattributes Avoid EOL diff horror by enforcing CRLF on commit 2015-04-26 12:53:35 +01:00
.gitignore #686 prevent redraw lock on error 2015-06-23 13:43:54 -04:00
.npmignore adds saucelabs integration to unit tests 2014-07-25 11:23:47 -04:00
.travis.yml Updated Travis CI config to run e2e tests 2014-05-28 23:46:09 +03:00
dragdrop.html m.module -> m.mount: fix sample code in HTML files 2015-08-28 09:07:08 -03:00
Gruntfile.js bump version 2015-07-23 23:43:38 -04:00
guide.html m.module -> m.mount: fix sample code in HTML files 2015-08-28 09:07:08 -03:00
LICENSE Initial commit 2014-03-16 18:59:39 -07:00
mithril.closure-compiler-externs.js Update externs for Google Closure compiler 2015-08-04 16:57:13 +02:00
mithril.d.ts Typescript: Support for Parameterized Components 2015-09-30 16:44:45 -04:00
mithril.js Make m.route.param() return all params #737 2015-08-18 20:44:58 +02:00
mithril.min.js Merge remote-tracking branch 'upstream/next' into speed, unfix "fixed" version 2015-07-23 05:26:31 -04:00
mithril.min.js.map Merge remote-tracking branch 'upstream/next' into speed, unfix "fixed" version 2015-07-23 05:26:31 -04:00
modulator-test.html Remove trailing whitespace 2015-07-09 03:38:42 -04:00
mvc.html m.module -> m.mount: fix sample code in HTML files 2015-08-28 09:07:08 -03:00
onerror.html clean up 2015-04-13 08:29:03 -04:00
package.json Bump npm version 2015-07-27 18:48:08 -04:00
README.md Update README gzip size statement 2015-09-23 16:41:26 -04:00

JS.ORG Join the chat at https://gitter.im/lhorie/mithril.js Support and Consulting Services Build Status

Mithril

A Javascript Framework for Building Brilliant Applications

See the website for documentation

There's also a blog and a mailing list


What is Mithril?

Mithril is a client-side MVC framework - a tool to organize code in a way that is easy to think about and to maintain.

Light-weight

  • Only 7kb gzipped, no dependencies
  • Small API, small learning curve

Robust

  • Safe-by-default templates
  • Hierarchical MVC via components

Fast

  • Virtual DOM diffing and compilable templates
  • Intelligent auto-redrawing system

Sample code

//namespace
var app = {};

//model
app.PageList = function() {
	return m.request({method: "GET", url: "pages.json"});
};

//controller
app.controller = function() {
	var pages = app.PageList();
	return {
		pages: pages,
		rotate: function() {
			pages().push(pages().shift());
		}
	}
};

//view
app.view = function(ctrl) {
	return [
		ctrl.pages().map(function(page) {
			return m("a", {href: page.url}, page.title);
		}),
		m("button", {onclick: ctrl.rotate}, "Rotate links")
	];
};


//initialize
m.mount(document.getElementById("example"), app);

Learn more