{{.}}
{{/each}}')(['Hockey', 'Hiking']) //-> `Hockey
Hiking
`\n ```\n\n If the value of a key is a [can.List](#section=section_can_List) only the minimum amount of DOM updates occur when the list changes.\n\n - [{{routeUrl hashes}}](http://canjs.com/docs/can.stache.helpers.routeUrl.html) - generates a url using [can.route](#section=section_can_route) for the provided hashes.\n\n ```\n can.stache(\"{{name}}\")({name: 'Item 23'}) //-> `Item 23`\n ```\n\n[Call methods](http://canjs.com/docs/can.stache.expressions.html#section_Callexpression) in your scope like: `{{method(value)}}`\n\n```\ncan.stache('10 {{pluralize(\"Baloon\" 10)}}
')({\n pluralize: function(subject, howMany) {\n if(howMany > 1) {\n subject += 's';\n }\n return subject;\n }\n}); //-> \"10 Baloons
\"\n```\n\n### can.view.bindings\n\n`can.view.bindings` allows you to bind to viewModel or DOM events and create one-way or two-way bindings on element's properties/attributes, can.Component viewModels and `can.stache`'s scope.\n\nCreate a one-way binding from the parent scope to a child's properties/attributes or viewModel:\n\n - [{child-prop}=\"value\"](http://canjs.com/docs/can.view.bindings.toChild.html) - One-way bind `value` in the scope to `childProp` in the viewModel.\n\n ```\n{{.}}
{{/each}}')(['Hockey', 'Hiking']) //-> `Hockey
Hiking
`\n ```\n\n If the value of a key is a [can.List](#section=section_can_List) only the minimum amount of DOM updates occur when the list changes.\n\n - [{{routeUrl hashes}}](http://canjs.com/docs/can.stache.helpers.routeUrl.html) - generates a url using [can.route](#section=section_can_route) for the provided hashes.\n\n ```\n can.stache(\"{{name}}\")({name: 'Item 23'}) //-> `Item 23`\n ```\n\n[Call methods](http://canjs.com/docs/can.stache.expressions.html#section_Callexpression) in your scope like: `{{method(value)}}`\n\n```\ncan.stache('10 {{pluralize(\"Baloon\" 10)}}
')({\n pluralize: function(subject, howMany) {\n if(howMany > 1) {\n subject += 's';\n }\n return subject;\n }\n}); //-> \"10 Baloons
\"\n```\n\n### can.view.bindings\n\n`can.view.bindings` allows you to bind to viewModel or DOM events and create one-way or two-way bindings on element's properties/attributes, can.Component viewModels and `can.stache`'s scope.\n\nCreate a one-way binding from the parent scope to a child's properties/attributes or viewModel:\n\n - [{child-prop}=\"value\"](http://canjs.com/docs/can.view.bindings.toChild.html) - One-way bind `value` in the scope to `childProp` in the viewModel.\n\n ```\n\n Get help and chat with our team in realtime! We love to answer questions and help out.\n
\n\n Search questions about DoneJS. We actively watch SO for questions to provide answers to the community.\n
\n\n Join us every Wednesday at Noon, CST for free DoneJS and JavaScript trainings lead by members of our team. We discuss different topics every week from the basics to advanced level techniques to help you step up your game. Also check out all of our past training sessions on youtube.\n
\n\n If you can gather 10 people in your nearest city, we’ll work with you to start a new meetup.\n
\n Get in Touch\n\n Help contribute to the core DoneJS project. Create an issue,
resolve bugs or add new features. We want and need your help!\n
\n (contribution guide coming soon)\n
\n\n Get help and chat with our team in realtime! We love to answer questions and help out.\n
\n\n Search questions about DoneJS. We actively watch SO for questions to provide answers to the community.\n
\n\n Join us every Wednesday at Noon, CST for free DoneJS and JavaScript trainings lead by members of our team. We discuss different topics every week from the basics to advanced level techniques to help you step up your game. Also check out all of our past training sessions on youtube.\n
\n\n If you can gather 10 people in your nearest city, we’ll work with you to start a new meetup.\n
\n Get in Touch\n\n Help contribute to the core DoneJS project. Create an issue,
resolve bugs or add new features. We want and need your help!\n
\n (contribution guide coming soon)\n
\n\n\n\n\nView the Documentation\n\n_Worker Thread Rendering is a feature of the [worker-render](https://github.com/canjs/worker-render) project._\n\n### Deploy to a CDN\n\nDoneJS makes it simple to deploy your static assets to a CDN (content delivery network).\n\nCDNs are distributed networks of servers that serve static assets (CSS, JS, and image files). You only push your files to one service, and the CDN takes care of pushing and updating your assets on different servers across the country and globe. As your app scales CDNs will keep up with the demand, and help support users regardless if they are in New York or Melbourne.\n\nYou spend less time worrying about performance micro-optimizations,\n...and more time working on epic pool dunk videos.\n\n
\n\n\n##### More information\n\nThe DoneJS testing layer involves many pieces, so if you want to learn more:\n\n * follow along in the [Unit testing view model and fixtures](./place-my-order.html#section=section_Creatingaunit_testedviewmodel) section of the guide\n * see how to run tests and set up CI automation in the [CI section](./place-my-order.html#section=section_Automatedtestsandcontinuousintegration) of the guide\n * read about [FuncUnit](http://funcunit.com/), the functional testing and asynchronous user action simulating library\n * read about [syn](https://github.com/bitovi/syn) - the synthetic event library\n * read about the [Testee.js](https://github.com/bitovi/testee) browser launcher, test runner, and reporting tool\n * read the [can.fixture](http://canjs.com/docs/can.fixture.html) docs\n\n### Documentation\n\nDocumentation is critical for maintainability of any complex application. When your team adds developers, docs ensure minimal ramp up time and knowledge transfer.\n\nYet most teams either don't write docs, or they'll do it \"later\" - a utoptian future period that is always just out of reach. Why? Because it's extra work to set up a tool, configure it, create and maintain separate documentation files.\n\nDoneJS comes with a documentation tool built in, and it generates multi-versioned documentation from inline code comments. It eliminates the barrier to producing docs, since all you have to do is comment your code (which most people already do) and run `donejs document`.\n\nYou spend less time messing with test infrastructure,\n...and more time mud ridin'.\n\n
\n\n\nView the Documentation\nView the Guide\n\n_DoneJS Documentation is a feature of [DocumentJS](http://documentjs.com/)_\n\n### Continuous Integration & Deployment\n\nContinuous Integration (CI) and Continuous Deployment (CD) are must have tools for any modern development team.\n\nCI is a practice whereby all active development (i.e. a pull request) is checked against automated tests and builds, allowing problems to be detected early (before merging the code into the release branch).\n\nYou spend less time messing with Documentation generators,\n...and more time perfecting your moonwalk.\n\n
\n\n\nView the Documentation\n\n_Live reload is a feature of [StealJS](http://stealjs.com/)._\n\n\n### Generators\n\nDoneJS generators help you kickstart new projects and components. They'll save you time, eliminating boilerplate by scaffolding a working project, component, or module.\n\nGenerator templates set up many of the best practices and features discussed in the rest of this page, without you even realizing it.\n\n#### How it works\n\nThe DoneJS generator uses Yeoman to bootstrap your application, component, or model.\n\nThere are four generators by default (and you can easily create your own).\n\n##### Project generator\n\nFrom the command line, run:\n\n```\ndonejs add app\n```\n\nYou'll be prompted for a project name, source folder, and other setup information. DoneJS' project dependencies will be installed, like StealJS and CanJS. In the folder that was created, you'll see:\n\n```\n├── .yo-rc.json\n├── build.js\n├── development.html\n├── documentjs.json\n├── package.json\n├── production.html\n├── readme.md\n├── src/\n| ├── app.js\n| ├── index.stache\n| ├── models/\n| | ├── fixtures\n| | | ├── fixtures.js\n| | ├── test.js\n| ├── styles.less\n| ├── test.html\n| ├── test/\n| | ├── test.js\n| | ├── functional.js\n├── node_modules/\n```\n\nYou're now a command away from running application wide tests, generating documentation, and running a build. Start your server with `donejs develop`, open your browser, and you'll see a functioning, server-side rendered hello world page.\n\n##### Modlet component generator\n\nTo create a [component](http://canjs.com/docs/can.Component.html) organized with the [modlet](#section_Modlets) file organization pattern:\n\n```\ndonejs add componentYou spend less time waiting for refreshes and builds,\n...and more time doing trust falls with giant yellow M&Ms.\n\n
\n\n\nView the Documentation\nView the Guide\n\n_Generators are provided by the [Generator DoneJS](https://github.com/donejs/generator-donejs) project with additional support via the [donejs-cli](https://github.com/donejs/cli) project_\n\n", - "description": " \nLearn about the features that will help you get your app done.\n\n### All-in-one stack\n\nDoneJS offers everything you need to build a modern web app. It comes with a module loader, build system, MVVM utilities, full testing layer, documentation generator, server side rendering utilities, a data layer, and more. Its completeness is itself a feature.\n\nThere's no mixing and matching pieces of your stack. Just `npm install` and get started.\n\nChoosing a modern stack is not at all simple or straightforward.\n\n1. *What types of tools do you want?* Server-side rendering? What is a virtual DOM? Do I need one? MVVM or Flux? Should I set up testing infrastructure? Documentation?\n\n2. *Choose all your pieces.* The good news is, you have [many choices](http://microjs.com/#). The bad news is, you have many choices. React, Angular, or Backbone? Require.js, browserify, or jspm? Jasmine or QUnit? What tool will run my tests?\n\n3. *Finally, you have to make sure your chosen tools work together effectively.* Does require.js work well with Angular? Does Karma work with Browserify? What about React and Babel?\n\nDoneJS gives you a full solution. It's our mission to eliminate any ambiguity around choosing technology for building an app, so you spend less time tinkering with your stack, and more time actually building your app.\n\nAnd as we've proven [over the last 8 years](/About.html#section=section_Evolve), we'll keep updating the stack as the state of the art evolves over time.\n\n### Integrated layers\n\nJust like Apple integrates the hardware and software for its devices, DoneJS integrates different technologies in a way that creates unique advantages that you can only get from using an integrated solution.\n\n#### Cross-layer features\n\nDoneJS makes it easier to do things that are not possible, or at best DIY, with competitor frameworks, by spanning technology layers. Here are a couple examples:\n\n##### 1. [Server-side rendering](#section=section_ServerSideRendered__Howitworks__PreppingyourappforSSR)\n\nServer-side rendering (SSR), which you can read about in more detail in its [section](#section_Server_SideRendered) below, spans many layers to make setup and integration simple.\n\nIt uses hooks in data components to automatically notify the server to delay rendering, [hot module swapping](#section=section_HotModuleSwapping) automatically integrates (no need to restart the server while developing), data is collected in an [inline cache](#section=section_CachingandMinimalDataRequests__Howitworks__Inlinecache) automatically and used to prevent duplicate AJAX requests. Support for these features is only possible because of code that spans layers, including can-connect, can-ssr, CanJS, and StealJS.\n\nBy contrast, React supports SSR, but you're left to your own devices to support delaying rendering, hot module swapping, and inline caching.\n\n##### 2. [Progressive enhancement](#section=section_ProgressiveLoading__Howitworks)\n\nYou can mark a section of your template to be progressively loaded by wrapping it with `You spend less time setting up your app,\n...and more time searching for carrots.\n\n
FEATURES | \n![]() | \n ![]() | \n ![]() | \n
---|---|---|---|
\n \n | \n\n | \n \n \n \n | \n \n manual setup and lacks most of the features/support DoneJS has.\" title=\"Requires some manual setup and lacks most of the features/support DoneJS has.\">\n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n \n \n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n\n\n\nView the Documentation\n\n_Worker Thread Rendering is a feature of the [worker-render](https://github.com/canjs/worker-render) project._\n\n### Deploy to a CDN\n\nDoneJS makes it simple to deploy your static assets to a CDN (content delivery network).\n\nCDNs are distributed networks of servers that serve static assets (CSS, JS, and image files). You only push your files to one service, and the CDN takes care of pushing and updating your assets on different servers across the country and globe. As your app scales CDNs will keep up with the demand, and help support users regardless if they are in New York or Melbourne.\n\nYou spend less time worrying about performance micro-optimizations,\n...and more time working on epic pool dunk videos.\n\n
\n\n\n##### More information\n\nThe DoneJS testing layer involves many pieces, so if you want to learn more:\n\n * follow along in the [Unit testing view model and fixtures](./place-my-order.html#section=section_Creatingaunit_testedviewmodel) section of the guide\n * see how to run tests and set up CI automation in the [CI section](./place-my-order.html#section=section_Automatedtestsandcontinuousintegration) of the guide\n * read about [FuncUnit](http://funcunit.com/), the functional testing and asynchronous user action simulating library\n * read about [syn](https://github.com/bitovi/syn) - the synthetic event library\n * read about the [Testee.js](https://github.com/bitovi/testee) browser launcher, test runner, and reporting tool\n * read the [can.fixture](http://canjs.com/docs/can.fixture.html) docs\n\n### Documentation\n\nDocumentation is critical for maintainability of any complex application. When your team adds developers, docs ensure minimal ramp up time and knowledge transfer.\n\nYet most teams either don't write docs, or they'll do it \"later\" - a utoptian future period that is always just out of reach. Why? Because it's extra work to set up a tool, configure it, create and maintain separate documentation files.\n\nDoneJS comes with a documentation tool built in, and it generates multi-versioned documentation from inline code comments. It eliminates the barrier to producing docs, since all you have to do is comment your code (which most people already do) and run `donejs document`.\n\nYou spend less time messing with test infrastructure,\n...and more time mud ridin'.\n\n
\n\n\nView the Documentation\nView the Guide\n\n_DoneJS Documentation is a feature of [DocumentJS](http://documentjs.com/)_\n\n### Continuous Integration & Deployment\n\nContinuous Integration (CI) and Continuous Deployment (CD) are must have tools for any modern development team.\n\nCI is a practice whereby all active development (i.e. a pull request) is checked against automated tests and builds, allowing problems to be detected early (before merging the code into the release branch).\n\nYou spend less time messing with Documentation generators,\n...and more time perfecting your moonwalk.\n\n
\n\n\nView the Documentation\n\n_Live reload is a feature of [StealJS](http://stealjs.com/)._\n\n\n### Generators\n\nDoneJS generators help you kickstart new projects and components. They'll save you time, eliminating boilerplate by scaffolding a working project, component, or module.\n\nGenerator templates set up many of the best practices and features discussed in the rest of this page, without you even realizing it.\n\n#### How it works\n\nThe DoneJS generator uses Yeoman to bootstrap your application, component, or model.\n\nThere are four generators by default (and you can easily create your own).\n\n##### Project generator\n\nFrom the command line, run:\n\n```\ndonejs add app\n```\n\nYou'll be prompted for a project name, source folder, and other setup information. DoneJS' project dependencies will be installed, like StealJS and CanJS. In the folder that was created, you'll see:\n\n```\n├── .yo-rc.json\n├── build.js\n├── development.html\n├── documentjs.json\n├── package.json\n├── production.html\n├── readme.md\n├── src/\n| ├── app.js\n| ├── index.stache\n| ├── models/\n| | ├── fixtures\n| | | ├── fixtures.js\n| | ├── test.js\n| ├── styles.less\n| ├── test.html\n| ├── test/\n| | ├── test.js\n| | ├── functional.js\n├── node_modules/\n```\n\nYou're now a command away from running application wide tests, generating documentation, and running a build. Start your server with `donejs develop`, open your browser, and you'll see a functioning, server-side rendered hello world page.\n\n##### Modlet component generator\n\nTo create a [component](http://canjs.com/docs/can.Component.html) organized with the [modlet](#section_Modlets) file organization pattern:\n\n```\ndonejs add componentYou spend less time waiting for refreshes and builds,\n...and more time doing trust falls with giant yellow M&Ms.\n\n
\n\n\nView the Documentation\nView the Guide\n\n_Generators are provided by the [Generator DoneJS](https://github.com/donejs/generator-donejs) project with additional support via the [donejs-cli](https://github.com/donejs/cli) project_\n\n", + "description": " \nLearn about the features that will help you get your app done.\n\n### All-in-one stack\n\nDoneJS offers everything you need to build a modern web app. It comes with a module loader, build system, MVVM utilities, full testing layer, documentation generator, server side rendering utilities, a data layer, and more. Its completeness is itself a feature.\n\nThere's no mixing and matching pieces of your stack. Just `npm install` and get started.\n\nChoosing a modern stack is not at all simple or straightforward.\n\n1. *What types of tools do you want?* Server-side rendering? What is a virtual DOM? Do I need one? MVVM or Flux? Should I set up testing infrastructure? Documentation?\n\n2. *Choose all your pieces.* The good news is, you have [many choices](http://microjs.com/#). The bad news is, you have many choices. React, Angular, or Backbone? Require.js, browserify, or jspm? Jasmine or QUnit? What tool will run my tests?\n\n3. *Finally, you have to make sure your chosen tools work together effectively.* Does require.js work well with Angular? Does Karma work with Browserify? What about React and Babel?\n\nDoneJS gives you a full solution. It's our mission to eliminate any ambiguity around choosing technology for building an app, so you spend less time tinkering with your stack, and more time actually building your app.\n\nAnd as we've proven [over the last 8 years](/About.html#section=section_Evolve), we'll keep updating the stack as the state of the art evolves over time.\n\n### Integrated layers\n\nJust like Apple integrates the hardware and software for its devices, DoneJS integrates different technologies in a way that creates unique advantages that you can only get from using an integrated solution.\n\n#### Cross-layer features\n\nDoneJS makes it easier to do things that are not possible, or at best DIY, with competitor frameworks, by spanning technology layers. Here are a couple examples:\n\n##### 1. [Server-side rendering](#section=section_ServerSideRendered__Howitworks__PreppingyourappforSSR)\n\nServer-side rendering (SSR), which you can read about in more detail in its [section](#section_Server_SideRendered) below, spans many layers to make setup and integration simple.\n\nIt uses hooks in data components to automatically notify the server to delay rendering, [hot module swapping](#section=section_HotModuleSwapping) automatically integrates (no need to restart the server while developing), data is collected in an [inline cache](#section=section_CachingandMinimalDataRequests__Howitworks__Inlinecache) automatically and used to prevent duplicate AJAX requests. Support for these features is only possible because of code that spans layers, including can-connect, can-ssr, CanJS, and StealJS.\n\nBy contrast, React supports SSR, but you're left to your own devices to support delaying rendering, hot module swapping, and inline caching.\n\n##### 2. [Progressive enhancement](#section=section_ProgressiveLoading__Howitworks)\n\nYou can mark a section of your template to be progressively loaded by wrapping it with `You spend less time setting up your app,\n...and more time searching for carrots.\n\n
FEATURES | \n![]() | \n ![]() | \n ![]() | \n
---|---|---|---|
\n \n | \n\n | \n \n \n \n | \n \n manual setup and lacks most of the features/support DoneJS has.\" title=\"Requires some manual setup and lacks most of the features/support DoneJS has.\">\n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n \n \n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
\n \n | \n\n | \n \n \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n \n \n | \n
\n \n | \n\n | \n \n | \n \n | \n
Ready to install DoneJS?
\n \n \n\nReady to install DoneJS?
\n \n\n iOS, Android, and Desktop Builds;\n Supports All Browsers, even IE8;\n Real time Connected;\n Pretty URL’s with Pushstate\n
\n\n Server Side Rendered (Isomorphic);\n Progressive Loading ;\n Minimal Data Requests;\n Minimal DOM Updates;\n Worker Thread Rendering;\n Deploy to a CDN\n
\n\n Comprehensive Testing;\n Documentation;\n Continuous Integration & Deployment;\n NPM Packages;\n ES6 Modules;\n Modlets;\n Custom HTML Elements;\n MVVM Architecture;\n Hot Module Swapping;\n Generators\n
\n\n iOS, Android, and Desktop Builds | \n Supports All Browsers, even IE8 | \n Real Time Connected | \n Pretty URL’s with Pushstate\n
\n\n Server Side Rendered (Isomorphic) | \n Progressive Loading | \n Minimal Data Requests | \n Minimal DOM Updates | \n Worker Thread Rendering | \n Deploy to a CDN\n
\n\n Server Side Rendered (Isomorphic) | \n Progressive Loading | \n Minimal Data Requests | \n Minimal DOM Updates | \n Worker Thread Rendering | \n Deploy to a CDN\n
\nDoneJS applications are architecturally Model-View-ViewModel, with a uniquely powerful and isolated ViewModel.
\n Learn More\nComprehensive tools for the entire testing lifecycle that make writing, running, and maintaining tests intuitive and easy.
\n Learn More\nSplit your app into reusable custom HTML elements, and easily share and consume them as NPM modules.
\n NPM Packages\n Custom Elements\nRun tests on every commit to detect problems early. Automate deployment to release early and often.
\n Learn More\nChanges to JavaScript, CSS, or template files are automatically reflected in your browser, without a refresh.
\n Learn More\nGenerate a multi-versioned, browsable documentation website from inline code comments.
\n Learn More\n\n Comprehensive Testing | \n Hot Module Swapping | \n Documentation | \n NPM Packages | \n Continuous Integration and Deployment | \n ES6 Modules | \n Modlets | \n Custom HTML Elements | \n MVVM Architecture | \n Generators\n
\n\n\n If you’re looking for help the best place to start is the forums or our Gitter chatroom.\n
\nReady to install DoneJS?
\n \n \n\nReady to install DoneJS?
\n \n\n iOS, Android, and Desktop Builds;\n Supports All Browsers, even IE8;\n Real time Connected;\n Pretty URL’s with Pushstate\n
\n\n Server Side Rendered (Isomorphic);\n Progressive Loading ;\n Minimal Data Requests;\n Minimal DOM Updates;\n Worker Thread Rendering;\n Deploy to a CDN\n
\n\n Comprehensive Testing;\n Documentation;\n Continuous Integration & Deployment;\n NPM Packages;\n ES6 Modules;\n Modlets;\n Custom HTML Elements;\n MVVM Architecture;\n Hot Module Swapping;\n Generators\n
\n\n iOS, Android, and Desktop Builds | \n Supports All Browsers, even IE8 | \n Real Time Connected | \n Pretty URL’s with Pushstate\n
\n\n Server Side Rendered (Isomorphic) | \n Progressive Loading | \n Minimal Data Requests | \n Minimal DOM Updates | \n Worker Thread Rendering | \n Deploy to a CDN\n
\n\n Server Side Rendered (Isomorphic) | \n Progressive Loading | \n Minimal Data Requests | \n Minimal DOM Updates | \n Worker Thread Rendering | \n Deploy to a CDN\n
\nDoneJS applications are architecturally Model-View-ViewModel, with a uniquely powerful and isolated ViewModel.
\n Learn More\nComprehensive tools for the entire testing lifecycle that make writing, running, and maintaining tests intuitive and easy.
\n Learn More\nSplit your app into reusable custom HTML elements, and easily share and consume them as NPM modules.
\n NPM Packages\n Custom Elements\nRun tests on every commit to detect problems early. Automate deployment to release early and often.
\n Learn More\nChanges to JavaScript, CSS, or template files are automatically reflected in your browser, without a refresh.
\n Learn More\nGenerate a multi-versioned, browsable documentation website from inline code comments.
\n Learn More\n\n Comprehensive Testing | \n Hot Module Swapping | \n Documentation | \n NPM Packages | \n Continuous Integration and Deployment | \n ES6 Modules | \n Modlets | \n Custom HTML Elements | \n MVVM Architecture | \n Generators\n
\n\n\n If you’re looking for help the best place to start is the forums or our Gitter chatroom.\n
\n{{message}}
\n\n```\n\nThen, add a routing rule for the `page` property in `src/app.js`:\n\n\n```js\nimport Map from \"can/map/\";\nimport route from \"can/route/\";\nimport 'can/map/define/';\nimport 'can/route/pushstate/';\n\nconst AppViewModel = Map.extend({\n define: {\n title: {\n value: 'donejs-chat',\n serialize: false\n }\n }\n});\n\nroute('/:page', { page: 'home' });\n\nexport default AppViewModel;\n\n```\n\n### Switch between pages\n\nFinally, we'll glue both components together as separate pages in `src/index.stache`. This is done by adding dynamic imports for the `home.component` and `messages/` components and showing each import based on the `page` property.\n\nUpdate `src/index.stache` to:\n\n\n```html\n\n \nCanJS provides the MV*
\nStealJS provides the infrastructure.
\n{{body}}
\n{{body}}
\n\n We make it easier than ever to order gourmet food\n from your favorite local restaurants.\n
\n \n\n \n Description for {{name}}\n
\n \n Order from {{name}}\n \n
\n\n Mark as:\n \n {{actionTitle}}\n \n
\n {{/if}}\n\n\n Delete\n
\n{{message}}
\n\n```\n\nThen, add a routing rule for the `page` property in `src/app.js`:\n\n\n```js\nimport DefineMap from 'can-define/map/';\nimport route from 'can-route';\nimport 'can-route-pushstate';\n\nconst AppViewModel = DefineMap.extend({\n page: 'string',\n title: {\n value: 'donejs-chat',\n serialize: false\n }\n});\n\nroute('/{page}', { page: 'home' });\n\nexport default AppViewModel;\n\n```\n\n### Switch between pages\n\nFinally, we'll glue both components together as separate pages in `src/index.stache`. This is done by adding dynamic imports for the `home.component` and `messages/` components and showing each import based on the `page` property.\n\nUpdate `src/index.stache` to:\n\n\n```html\n\n \nCanJS provides the MV*
\nStealJS provides the infrastructure.
\n{{body}}
\n{{body}}
\n\n We make it easier than ever to order gourmet food\n from your favorite local restaurants.\n
\n \n\n \n Description for {{name}}\n
\n \n Order from {{name}}\n \n
\n\n Mark as:\n \n {{actionTitle}}\n \n
\n {{/if}}\n\n\n Delete\n
\n