{"action":"created","comment":{"url":"https://api.github.com/repos/meteor/guide/pulls/comments/47052043","id":47052043,"diff_hunk":"@@ -0,0 +1,543 @@\n+---\n+title: Blaze\n+---\n+\n+After reading this guide, you'll know:\n+\n+1. How to use the Spacebars syntax, used to define Blaze templates.\n+2. Best practice towards creating reusable components in Blaze.\n+3. How the Blaze rendering engine works under the hood and some techniques to best use it.\n+4. How to test Blaze templates.\n+\n+Blaze is Meteor's built in reactive rendering library. Using templates written in [Spacebars](https://github.com/meteor/meteor/blob/devel/packages/spacebars/README.md), a variant of [Handlebars](http://handlebarsjs.com) designed to take advantage of [Tracker](https://github.com/meteor/meteor/tree/devel/packages/tracker), Meteor's reactivity system.\n+\n+Blaze is not required to built applications in Meteor---you can equally use [React](http://react-in-meteor.readthedocs.org/en/latest/) or [Angular](http://www.angular-meteor.com), however this guide will take you through best practice in building an application in Blaze.\n+\n+<a id=\"spacebars\">Spacebars</a>\n+\n+Spacebars is a handlebars-like templating language, built off the concept of rendering a reactivily changing *data context*. Spacebars templates look like simple HTML with special \"mustache\" tags delimited by `{{` and `}}`.\n+\n+As an example, consider the `todosItem` template from the Todos example app:\n+\n+```html\n+<template name=\"todosItem\">\n+  <div class=\"list-item {{checkedClass}} {{editingClass}}\">\n+    <label class=\"checkbox\">\n+      <input type=\"checkbox\" checked={{todo.checked}} name=\"checked\">\n+      <span class=\"checkbox-custom\"></span>\n+    </label>\n+\n+    <input type=\"text\" value=\"{{todo.text}}\" placeholder=\"Task name\">\n+    <a class=\"js-delete-item delete-item\" href=\"#\">\n+      <span class=\"icon-trash\"></span>\n+    </a>\n+  </div>\n+</template>\n+```\n+\n+In this example, the template is rendered with an object with key `todo` as data context (we'll see below how to enforce that). We access the properties of the `todo`  using the mustache tag, such as `{{todo.text}}`. The default behaviour is to render that property as a string; however in some cases (such as `checked=={{todo.checked}}` it can be resolved as a boolean value).\n+\n+Note that simple string interpolations like this will never render HTML---so you don't need to perform safety checks for XSS.\n+\n+Additionally we can see an example of a *template helper*---`{{checkedClass}}` calls out to the `checkedClass` helper defined in a separate JavaScript file on the `todosItem` template:\n+\n+```js\n+Template.todosItem.helpers({\n+  checkedClass() {\n+    return this.todo.checked && 'checked';\n+  }\n+});\n+```\n+\n+In the context of a template helper, `this` is scoped to the the *data context* of the template.\n+\n+Apart from simple interpolation, mustache tags can control flow of the template. For instance, in the `listsShow` template, we render a list of todos via:\n+\n+```html\n+  {{#each todo in todos}}\n+    {{> todosItem (todoArgs todo)}}\n+  {{else}}\n+    <div class=\"wrapper-message\">\n+      <div class=\"title-message\">No tasks here</div>\n+      <div class=\"subtitle-message\">Add new tasks using the field above</div>\n+    </div>\n+  {{/each}}\n+```\n+\n+This snippet illustrates a few things:\n+\n+ - The `{{#each in}}` block helper which renders a block one per element in an array or cursor, or an `{{else}}` block if no items exist.\n+ - Template inclusion `{{> todosItem (todoArgs todo)}}` which renders the `todosItem` template with a set data context, based on the output of the `todosArg` helper.\n+\n+You can read about the full Spacebars syntax [here](https://github.com/meteor/meteor/blob/devel/packages/spacebars/README.md), but in this section we'll attempt to cover some important finer details.\n+\n+<h3 id=\"data-contexts\">Data contexts and lookup</h3>\n+We've seen `{{todo.title}}` accesses the `title` property of the `todo` item on the current data context. Additionaly, `..` access the parent data context (rarely a good idea), `list.todos.[0]` accesses the first element of the `todos` array on `list`.\n+\n+Also, note that Spacebars is very forgiving of `null` values. It will not complain if you try to access a property on a `null` value (for instance `foo.bar` if `foo` is not defined), but instead simply treat it also as null. However there are exceptions to this---trying to call a `null` function, or doing the same *within* a helper will lead to exceptions.\n+\n+<h3 id=\"helpers\">Calling helpers with arguments</h3>\n+You can provide arguments to a helper like `checkedClass` by simply placing the argument after the helper call, as in: `{{checkedClass todo true 'checked'}}`. You can also provide a list of named keyword arguments to a helper with `{{checkedClass todo noClass=true classname='checked'}}. In this case, you might access those arguments with:\n+\n+```js\n+Template.todosItem.helpers({\n+  checkedClass(todo, kws) {\n+    const classname = kws.hash.classname || 'checked';\n+    if (todo.checked) {\n+      return classname;\n+    } else if (kws.hash.noClass) {\n+      return `no-${classname}`;\n+    }\n+  }\n+});\n+```\n+\n+You can also pass the output of a helper to a template inclusion or other helper. To do so, use brackets to show precedence:\n+\n+```html\n+{{> todosItem (todoArgs todo)}}\n+```\n+\n+Here the `todo` is passed as argument to the `todoArgs` helper, then the output is passed into the `todosItem` template.\n+\n+<h3 id=\"inclusion\">Template inclusion</h3>\n+You \"include\" a subtemplate with the `{{>` syntax. By default, the sub-template will gain the data context of the caller, although it's usually a good idea to be explicit. You can provide a single object as argument (as we did with the object returned by the `todoArgs` helper above), or provide a list of keyword arguments, as the `listShowPage` template does:\n+\n+```html\n+{{> listsShow todosReady=Template.subscriptionsReady\n+  list=(getFullList listIdOnly) todos=listIdOnly.todos}}\n+```\n+\n+In this case, the `listShow` template can expect a data context of the form:\n+\n+```js\n+{\n+  todosReady: ...,\n+  list: ...,\n+  todos: ...\n+}\n+```\n+\n+<h3 id=\"helpers-in-tags\">Helpers in tags</h3>\n+We saw above that using a helper (or data context lookup) in the form `checked={{todo.checked}}` will add the checked property to the HTML tag if `todo.checked` evaluates to true. Also, you can directly include an object as part of an HTML to apply multiple properties at once:\n+\n+```html\n+<a {{attributes}}>My Link</a>\n+```\n+\n+// XXX: can we find an example of this in Todos?\n+\n+```js\n+Template.foo.helpers({\n+  attributes: () => {\n+    return {\n+      class: 'A class',\n+      style: {background: 'blue'}\n+    };\n+  }\n+});\n+```\n+\n+<h3 id=\"rendering-html\">Rendering pure HTML</h3>\n+Although by default a mustance tag won't render any HTML, for XSS security reasons, you can render pure HTML with the triple-mustache: `{{{`.\n+\n+```html\n+{{{myHtml}}}\n+```\n+\n+```js\n+Template.foo.helpers({\n+  myHtml() {\n+    return '<h1>This H1 will render</h1>';\n+  }\n+});\n+```\n+\n+You should be extremely careful about doing this, and always ensure you aren't returning user-generated content (or escape it if you do!) from such a helper.\n+\n+<h3 id=\"block-helpers\">Block Helpers</h3>\n+A block helper, called with `{{#` is a helper that takes (and may render) a block of Spacebars. For instance, we saw the `{{#each in}}` helper above which repeats a given block of Spacebars once per item in a list. You can also render a *template* as a block helper, rendering it's content via the `Template.contentBlock` and `Template.eachBlock`. For instance, you could create your own `{{#if}}` helper with:\n+\n+```html\n+<template name=\"myIf\">\n+  {{#if condition}}\n+    {{> Template.contentBlock}}\n+  {{else}}\n+    {{> Template.elseBlock}}\n+  {{/if}}\n+</template>\n+\n+<template name=\"caller\">\n+  {{#myIf condition=true}}\n+    <h1>I'll be rendered!</h1>\n+  {{/myIf}}\n+```\n+\n+<h3 id=\"builtin-block-helpers\">Builtin Block Helpers</h3>\n+There are a few builtin block helpers that are worth knowing about:\n+\n+<h4 id=\"if-unless\">If / Unless</h4>\n+\n+The `{{#if}}` and `{{#unless}}` helpers are fairly straightforward but invaluable for controlling the content generated by a template. Both operate by evaluating and checking their single argument for \"falsey\"-ness (in JS this means `null`, `undefined`, `0`, `''`, `[]` and of course `false`).\n+\n+```html\n+{{#if something}}\n+  <p>It's true</p>\n+{{else}}\n+  <p>It's false</p>\n+{{/if}}\n+```\n+\n+<h4 id=\"each-in\">Each-in</h4>\n+\n+The `{{#each in}}` helper is a convenient way to step over a list whilst retaining the outer data context. \n+\n+```html\n+{{#each todo in todos}}\n+{{/each}}\n+```\n+\n+In this case `todo` will be added to the data context within the block, but all the existing data context items (`list` and `todosReady` in this case) will remain available.\n+\n+<h4 id=\"let\">Let</h4>\n+The `{{#let}}` helper is useful to capture the output of a helper or document subproperty within a template:\n+\n+```html\n+{{#let name=person.bio.firstName color=generateColor}}\n+  <div>{{name}} gets a {{color}} card!</div>\n+{{/let}}\n+```\n+\n+XXX: what to do about d.c. changing helpers such as with/each?\n+\n+<h4 id=\"strictness\">Strictness</h4>\n+Spacebars starts from a very strict interpretation of HTML. In particular you need to careful about self-closing tags and when you are allowed to use them. For instance, you can't self-close a `div` (`<div/>`) in Spacebars.\n+\n+<h4 id=\"escaping\">Escaping</h4>\n+To insert a literal {{, {{{, or any number of curly braces, put a vertical bar after it. So `{{|` will show up as `{{`, `{{{|` will show up as `{{{`, and so on.\n+\n+<h2 id=\"reusable-components\">Creating reusable components in Blaze</h2>\n+In <a href=\"ui-ux\">the UI/UX article</a> we discussed the merits of creating reusable components that are modular and depend and interact with their environment in clear and minimal ways. \n+\n+Although Blaze, as a simple template-based runtime, doesn't enforce a lot of these principles (as some other rendering frameworks, such as React, do) you can take steps to write your Blaze components in such a way that you can enjoy most of the same benefits. This section will attempt to outline some \"best practice\" for writing such Blaze components.\n+\n+Examples below will reference the `listShow` component from the Todos example app.\n+\n+<h3 id=\"validate-data-context\">Validate data contexts</h3>\n+In order to ensure your component is only used in the way you expect, you should validate the data context provided to it. The data context provides the inputs to the component and so should be checked.\n+\n+XXX: this does not yet work\n+\n+You can do this in the components `onCreated()` callback, like so:\n+\n+```js\n+Template.listsShow.onCreated(function() {\n+  this.autorun(() => {\n+    check(Template.data(), new SimpleSchema({\n+     list: {blackbox: true},\n+     todosReady: {type: Boolean}\n+   }));\n+  });\n+```\n+\n+By placing the check in an `autorun()` we ensure that even if the data contexts reactively changes, it always fits the expected schema.\n+\n+<h3 id=\"name-data-contexts\">Name data contexts to template inclusions</h3>\n+It's tempting to provide the data context of a sub-template as a \"raw\" object (like `{{> todosItem todo}}`), it's a better idea to explicitly give it a name (`{{> todosItem todo=todo}}`). There are two primary reasons for this:\n+\n+1. When using the data in the sub-template, it's a lot clearer what you are accessing `{{todo.title}}` is clearer than `title`.\n+2. It's more flexible, in case in future you need to provide more arguments to the template.\n+\n+  For instance, in the case of the `todosItem` sub-template, we need to provide two extra arguments to control the editing state of the item, which would have been a hassle to add if the item was used with a raw `todo` argument.\n+\n+Additionally, for similar reasons of clarity, always explicitly provide a data context to an inclusion, rather than letting it passively \"fall-through\".\n+\n+<h3 id=\"use-each-in\">Prefer `{{#each .. in}}`</h3>\n+For similar reasons to the above, it's better to use `{{#each todo in todos}}` rather than the older `{{#each todos}}`. The second sets the data context of it's internals to a raw `todo`, and makes it difficult to access the containing template's other data context. \n+\n+The only reason not to use `{{#each .. in}}` because it makes it difficult to access the `todo` symbol inside event handlers. Typically the solution to this is simply to use a sub-component to render the inside of the loop.\n+\n+<h3 id=\"use-template-instance\">Use the template instance</h3>\n+Although Blaze doesn't currently have a fully baked component model, you can use the *template instance* as a convenient place to modularize functionality. The template instance is `this` inside template lifecycle callbacks and can be accessed in event handlers and helpers as `Template.instance()`. It's also passed as second argument to event handlers.\n+\n+We suggest a convention of naming it `instance` in these contexts and assigning it at the top of every relevant helper. For instance:\n+\n+```js\n+Template.listsShow.helpers({\n+  todoArgs(todo) {\n+    const instance = Template.instance();\n+    return {\n+      todo,\n+      editing: instance.state.equals('editingTodo', todo._id),\n+      onEdit(doEdit) {\n+        instance.state.set('editingTodo', doEdit ? todo._id : false);\n+      }\n+    };\n+  }\n+});\n+\n+Template.listsShow.events({\n+  'click .js-cancel'(event, instance) {\n+    instance.state.set('editing', false);\n+  }\n+});\n+```\n+\n+<h3 id=\"reactive-dict-state\">Use a reactive dict for state</h3>\n+The [`reactive-dict`](https://atmospherejs.com/meteor/reactive-dict) package is a simple API to create a reactive key-value store. It's a convenient way to attach internal state to a component. We create the `state` dict in the `onCreated` callback, and attach it to the template instance:\n+\n+```js\n+Template.listsShow.onCreated(function() {\n+  this.state = new ReactiveDict();\n+  this.state.setDefault({\n+    editing: false,\n+    editingTodo: false\n+  });\n+});\n+```\n+\n+Once the state has been created we can access it from helpers and modify it in event handlers (see above).\n+\n+<h3 id=\"attach-functions-to-instance\">Attach functions to the instance</h3>\n+If you have common functionality for a template instance that needs to be abstracted or called from multiple event handlers, it's sensible to attach it as functions directly to the template instance in the `onCreated()` callback:\n+\n+```js\n+Template.listsShow.onCreated(function() {\n+  this.saveList = () => {\n+    this.state.set('editing', false);\n+\n+    Lists.methods.updateName.call({\n+      listId: this.data.list._id,\n+      newName: this.$('[name=name]').val()\n+    }, (err) => {\n+      err && alert(err.error); // XXX i18n\n+    });\n+  };\n+});\n+```\n+\n+Then you can call that function from within an event handler:\n+\n+```js\n+Template.listsShow.events({\n+  'submit .js-edit-form'(event, instance) {\n+    event.preventDefault();\n+    instance.saveList();\n+  }\n+});\n+```\n+\n+<h3 id=\"scope-dom-lookups-to-instance\">Scope DOM lookups to the template instance</h3>\n+It's a bad idea to look up things directly in the DOM with jQuery's global `$()`. It means you are relying on things rendered outside of your component not interacting with your selector. Also, it limits your options on rendering *outside* of the main document (see testing section below).\n+\n+Instead, Blaze gives you `instance.$()` which scopes a lookup to within the current template instance. Typically you use this either from a `onRendered()` callback to setup external (e.g. jQuery) plugins, or from event handlers to call direct DOM functions. For instance, when a user adds a new todo, we want to focus it's `<input>` element:\n+\n+```js\n+Template.listsShow.events({\n+  'click .js-todo-add'(event, instance) {\n+    instance.$('.js-todo-new input').focus();\n+  }\n+});\n+```\n+\n+<h3 id=\"js-selectors-for-events\">Use `.js-` selectors for event maps</h3>\n+When you are setting up event maps in your JS files, you need to 'select' the element in the template that the event attaches to. Rather than using the same CSS classnames that are used to style the elements, it's better practice to use classnames that are specifically added for those event maps. A reasonable convention is a class starting with `js-` to indicate it is used by the JavaScript. For instance `.js-todo-add` above.\n+\n+<h3 id=\"passing-template-content\">Passing HTML content as template arguments</h3>\n+If you need to pass in content to a sub-template (for instance the content of a modal dialog), you can use the [custom block helper](#block-helpers) to provide a block of content. If you need more flexibility, typically just providing a named template a data context is the way to go. The sub-template can then just render that template with\n+\n+```html\n+{{> Template.dynamic templateName dataContext}}\n+```\n+\n+This is more or less the way that the [`kadira:blaze-layout`](https://atmospherejs.com/kadira/blaze-layout) package works in practice.\n+\n+<h3 id=\"pass-callbacks\">Pass callbacks</h3>\n+If you need to communicate *up* the template hierarchy, it's best to pass a *callback* for the subtemplate to call.\n+\n+For instance, only one todo item can be currently in the editing state at a time, so the `listsShow` template manages the state of which is edited. So when you focus on an item, that item needs to tell the list's template to make it the \"edited\" one. To do that, we pass a callback into the `todosItem` template, and it calls it:\n+\n+```html\n+{{> todosItem (todoArgs todo)}}\n+```\n+\n+```js\n+Template.listsShow.helpers({\n+  todoArgs(todo) {\n+    const instance = Template.instance();\n+    return {\n+      todo,\n+      editing: instance.state.equals('editingTodo', todo._id),\n+      onEdit(doEdit) {\n+        instance.state.set('editingTodo', doEdit ? todo._id : false);\n+      }\n+    };\n+  }\n+});\n+\n+Template.todosItem.events({\n+  'focus input[type=text]'() {\n+    this.onEdit(true);\n+  }\n+});\n+```\n+\n+<h3 id=\"onrendered-for-libs\">Use `onRendered()` to callout to 3rd party libraries</h3>\n+As we mentioned above, the `onRendered()` callback is typically the right spot to call out to third party libraries that expect a pre-rendered DOM (such as jQuery plugins). The `onRendered()` callback is triggered *once* after the template is rendered and attached to the DOM for the first time.\n+\n+Occasionally, you may need to wait for data to become ready before it's time to attach the plugin (although typically it's a better idea to use a sub-template in this use case). To do so, you can setup an `autorun` in the `onRendered()` callback. For instance, in the `listShowPage` template, we want to wait until the subscription for the list is ready (i.e. the todos have rendered) before we hide the launch screen:\n+\n+```\n+Template.listsShowPage.onRendered(function() {\n+  this.autorun(() => {\n+    if (this.subscriptionsReady()) {\n+      // Handle for launch screen defined in app-body.js\n+      AppLaunchScreen.listRender.release();\n+    }\n+  });\n+});\n+```\n+\n+<h2 id=\"smart-components\">Writing smart components with Blaze</h2>\n+If your component needs to access state outside of its data context---for instance, data from the server via subscriptions or the the contents of client-side store, then you should be careful how you do that accessing. As discussed in the [data loading article](data-loading) you should be careful and considered in how use such smart components.\n+\n+To begin with, all of the rules of thumb about reusable components apply to smart components. In addition:\n+\n+<h3 id=\"subscribing\">Subscribe from `onCreated`</h3>\n+You should subscribe to publications on the server from an `onCreated` callback (within an `autorun` block if you are reliant on reactively changing arguments). In the Todos example app, in the `listsShowPage` template we subscribe to the `list/todos` publication based on the current `_id` FlowRouter param:\n+\n+```js\n+Template.listsShowPage.onCreated(function() {\n+  this.state = new ReactiveDict();\n+  this.autorun(() => {\n+    const listId = FlowRouter.getParam('_id');\n+    this.state.set({listId});\n+    this.subscribe('list/todos', listId);\n+  });\n+});\n+```\n+\n+By using `this.subscribe()` (as opposed to `Meteor.subscribe`), the subscription state automatically gets amalagamated into the template instance's subscription readiness reactive state variable, which can be used both from within templates (via the `subscriptionsReady` helper) or within helpers (via `Template.subscriptionsReady()`).\n+\n+Notice as well in this case that we access the global client-side state store `FlowRouter` in the `onCreated()` callback also, storing its value locally in a local `state` dictionary.\n+\n+XXX: should instead we just read from flow router a second time here: https://github.com/meteor/todos/blob/master/packages/lists-show/lists-show-page.js#L28 ??\n+\n+<h3 id=\"fetch-in-smart-components\">Fetch in helpers</h3>\n+Typically, as [outlined in the ui/ux article](ui-ux.md#smart-components) you should fetch data in the same component that you subscribe in. In Blaze, it's usually simplest to fetch the data in a helper, which you can then use to pass data into a reusable child component. For example, in the `listShowPage`: \n+\n+```html\n+{{> listsShow todosReady=Template.subscriptionsReady\n+  list=(getFullList listIdOnly) todos=listIdOnly.todos}}\n+```\n+\n+<h2 id=\"reusing-code\">Reusing code in Blaze</h2>\n+It's not uncommon to want to reuse code between two otherwise unrelated components. There are two principal ways to do this in Blaze.\n+\n+<h3 id=\"composition\">Composition</h3>\n+If possible, it's usually best to try and abstract out the reusable part of the two components that need to share functionality. If you are used to following patterns to [create reusable components](#reusable-components), then it should be simple to reuse those components in many places. ","path":"content/blaze.md","position":453,"original_position":438,"commit_id":"00d6072fabdd9483c021fbaf0b37e04477ce5f65","original_commit_id":"b9291f572b55c3a2226763991b8268d67efd7384","user":{"login":"tmeasday","id":132554,"avatar_url":"https://avatars.githubusercontent.com/u/132554?v=3","gravatar_id":"","url":"https://api.github.com/users/tmeasday","html_url":"https://github.com/tmeasday","followers_url":"https://api.github.com/users/tmeasday/followers","following_url":"https://api.github.com/users/tmeasday/following{/other_user}","gists_url":"https://api.github.com/users/tmeasday/gists{/gist_id}","starred_url":"https://api.github.com/users/tmeasday/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmeasday/subscriptions","organizations_url":"https://api.github.com/users/tmeasday/orgs","repos_url":"https://api.github.com/users/tmeasday/repos","events_url":"https://api.github.com/users/tmeasday/events{/privacy}","received_events_url":"https://api.github.com/users/tmeasday/received_events","type":"User","site_admin":false},"body":"Hrmm, need a better example for composition. Something not immediately obvious where you would pull out a sub-component if you wanted to share functionality.\r\n\r\nI think this example doesn't really work as a subcomponent -- what would the component render?","created_at":"2015-12-09T05:11:01Z","updated_at":"2015-12-09T05:11:01Z","html_url":"https://github.com/meteor/guide/pull/139#discussion_r47052043","pull_request_url":"https://api.github.com/repos/meteor/guide/pulls/139","_links":{"self":{"href":"https://api.github.com/repos/meteor/guide/pulls/comments/47052043"},"html":{"href":"https://github.com/meteor/guide/pull/139#discussion_r47052043"},"pull_request":{"href":"https://api.github.com/repos/meteor/guide/pulls/139"}}},"pull_request":{"url":"https://api.github.com/repos/meteor/guide/pulls/139","id":52944325,"html_url":"https://github.com/meteor/guide/pull/139","diff_url":"https://github.com/meteor/guide/pull/139.diff","patch_url":"https://github.com/meteor/guide/pull/139.patch","issue_url":"https://api.github.com/repos/meteor/guide/issues/139","number":139,"state":"open","locked":false,"title":"Blaze content","user":{"login":"tmeasday","id":132554,"avatar_url":"https://avatars.githubusercontent.com/u/132554?v=3","gravatar_id":"","url":"https://api.github.com/users/tmeasday","html_url":"https://github.com/tmeasday","followers_url":"https://api.github.com/users/tmeasday/followers","following_url":"https://api.github.com/users/tmeasday/following{/other_user}","gists_url":"https://api.github.com/users/tmeasday/gists{/gist_id}","starred_url":"https://api.github.com/users/tmeasday/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tmeasday/subscriptions","organizations_url":"https://api.github.com/users/tmeasday/orgs","repos_url":"https://api.github.com/users/tmeasday/repos","events_url":"https://api.github.com/users/tmeasday/events{/privacy}","received_events_url":"https://api.github.com/users/tmeasday/received_events","type":"User","site_admin":false},"body":"This is done, barring testing, which I'll do post-testing article\n<a href='#crh-start'></a><a href='#crh-data-%7B%22processed%22%3A%20%5B%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46922770%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46922856%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46923841%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46923962%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46923988%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924033%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924063%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924114%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924129%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924201%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924228%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924273%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924305%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924409%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924466%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924524%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924580%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924665%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924901%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47039618%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47039661%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040756%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040867%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040883%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040909%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040922%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040937%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47040972%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47041931%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47041959%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47041971%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47041983%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47041987%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042035%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042088%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042150%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042193%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042317%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042330%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042496%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042585%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042669%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042740%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042789%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042804%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042848%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042940%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042953%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042992%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043018%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043127%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043235%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043248%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043251%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043269%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043288%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043320%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043400%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47043445%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47044579%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47044656%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47044664%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47044978%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045142%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045188%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045190%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045231%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045382%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045424%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045425%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47046610%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47051770%22%2C%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47051780%22%5D%2C%20%22comments%22%3A%20%7B%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20159%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924063%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%60eachBlock%60%20-%3E%20%60elseBlock%60%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A03%3A37Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A22%3A44Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20243%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924466%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22This%20sentence%20is%20janky%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A08%3A41Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Hmm%2C%20what%20would%20you%20say%20instead%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A41%3A55Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%3Ca%20href%3D%27%23crh-update-none%27%3E%3C/a%3E%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A38%3A48Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20261%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924580%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%5C%22Although%20Blaze%20doesn%27t%20currently%20have%20a%20fully%20baked%20component%20model%5C%22%20is%20overly%20negative%20IMO.%20Plus%20I%20bet%20certain%20people%20would%20disagree%20with%20this%20statement.%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A10%3A07Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Better%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A49%3A20Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%3Ca%20href%3D%27%23crh-update-none%27%3E%3C/a%3E%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A33%3A31Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20438%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042669%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22I%27m%20not%20sure%20what%20this%20is%20recommending%20-%20should%20the%20functionality%20be%20factored%20out%20into%20a%20wrapper%20component%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A48%3A43Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Oh%2C%20I%20guess%20I%20was%20thinking%20of%20composition%2C%20if%20you%20can%20figure%20out%20a%20way%20to%20make%20it%20a%20child%20component.%20A%20wrapper%20component%20is%20sort%20of%20like%20complex%20composition%2C%20works%20too..%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A00%3A06Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22I%20should%20probably%20think%20of%20an%20example%20here%20and%20demo%20it.%20Any%20ideas%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A01%3A14Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22I%20guess%20a%20common%20thing%20can%20be%20having%20some%20complex%20state%20or%20event%20handler%20logic.%20For%20example%2C%20you%20want%20to%20do%20auto-completing%20user%20search%2C%20and%20you%20want%20this%20to%20work%20inside%20a%20text%20area%20to%20tag%20users%2C%20or%20in%20a%20user%20selector%20somewhere.%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A32%3A29Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%2052%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46923841%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Data%20context%20of%20the%20element%20where%20the%20helper%20was%20used%2C%20not%20the%20template.%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A00%3A19Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Also%2C%20I%20feel%20like%20we%20should%20discourage%20using%20%60this%60%20inside%20helpers%20in%20favor%20of%20passing%20arguments%20or%20using%20%60Template.instance%28%29.data%60%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A05%3A41Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22What%20do%20you%20think%20now%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A20%3A32Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22I%20don%27t%20think%20you%20pushed%20your%20change%20yet.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A39%3A16Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Yeah%20I%20write%20the%20comments%20as%20I%20go%20through%20the%20file%20and%20then%20push%20at%20the%20end%2C%20sorry.%20Pushed%20now.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A52%3A54Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%3Ca%20href%3D%27%23crh-update-complete%27%3E%3C/a%3E%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A33%3A31Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%201cc46ddc6efbc431ff7243bb3a73a28c36863b20%20content/blaze.md%20249%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47045382%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22We%20use%20an%20%60autorun%28%29%60%20to%20make%20sure%20that%20the%20data%20context%20is%20validated%20again%20whenever%20it%20changes.%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A37%3A53Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%22%2C%20%22created_at%22%3A%20%222015-12-09T03%3A05%3A30Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-561%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%207%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46922770%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Hmm%2C%20technically%20they%20are%20Spacebars%20templates%2C%20Blaze%20is%20just%20the%20underlying%20rendering%20engine...%20what%20do%20you%20think%3F%20Too%20pedantic%3F%20People%20use%20the%20word%20%5C%22Blaze%5C%22%20to%20refer%20to%20the%20whole%20thing%20these%20days.%22%2C%20%22created_at%22%3A%20%222015-12-08T07%3A41%3A22Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A06%3A11Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20239%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924409%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%60%60%60js%5Cr%5Cnnew%20SimpleSchema%28%7B%5Cr%5Cn%20%20list%3A%20%7Bblackbox%3A%20true%7D%2C%5Cr%5Cn%20%20todosReady%3A%20%7Btype%3A%20Boolean%7D%5Cr%5Cn%7D%29.validate%28Template.data%28%29%29%3B%5Cr%5Cn%60%60%60%5Cr%5Cn%5Cr%5CnThis%20works%20fine%2C%20we%20don%27t%20need%20to%20call%20%60check%60.%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A07%3A59Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Yeah.%20We%20just%20need%20to%20make%20sure%20it%20actually%20works%20%28right%20now%20it%20throws%20due%20to%20the%20%60list%60%20failing%20the%20object%20test%29%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A40%3A20Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20122%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46923962%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%5C%22include%20an%20object%20as%20part%20of%20an%20HTML%20to%20apply%20multiple%20properties%20at%20once%3A%5C%22%20-%3E%20%5C%22Include%20an%20object%20in%20the%20attribute%20list%20of%20an%20HTML%20element%20to%20set%20multiple%20attributes%20at%20once.%5C%22%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A02%3A12Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A22%3A01Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20214%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924305%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22You%20also%20need%20to%20close%20tags%20that%20don%27t%20need%20to%20be%20closed%20in%20HTML5%2C%20like%20%60%3Cp%3E%60.%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A06%3A39Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A38%3A12Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20272%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924665%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%60doEdit%60%20is%20a%20super%20weird%20variable%20name.%20Not%20sure%20what%20it%20does.%20Maybe%20this%20is%20%60onFocusChange%60%20and%20%60focusStatus%60%20or%20%60onEditingStateChange%60%20and%20%60editingState%60%3F%20Or%20maybe%20even%20%60onFocus%60/%60onBlur%60.%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A11%3A11Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22How%20about%20just%20%60onEditingChange%60%20and%20%60editing%60%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A50%3A10Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22Sounds%20good%21%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A58%3A37Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A22%3A49Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20142%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924033%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22mustance%20-%3E%20mustache%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A03%3A12Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A22%3A35Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20217%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924273%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Whoa%2C%20I%20had%20no%20idea...%20this%20would%20really%20simplify%20some%20stuff%20in%20the%20docs%20app%20lol%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A06%3A16Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22This%20is%20like%20basically%20copied%20out%20of%20the%20spacebars%20docs.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A38%3A23Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A38%3A26Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20258%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924524%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22sub-component%20-%3E%20sub-template%3F%20Not%20sure%20if%20we%20are%20using%20the%20word%20component%20to%20refer%20to%20Blaze%20entities%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A09%3A35Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22I%20think%20I%27m%20pretty%20inconsistent%20in%20this%20article.%20I%27ve%20used%20component%20more%20or%20less%20everywhere%20else%20in%20the%20guide.%20It%27s%20hard%20to%20know%20what%20to%20use%20in%20this%20article%2C%20sometimes%20it%20seems%20like%20it%20should%20be%20component%20%28like%20when%20talking%20about%20%5C%22reusability%5C%22%29%2C%20other%20times%20template%20%28when%20talking%20about%20technicalities%20with%20Blaze%29.%20%20%5Cr%5Cn%5Cr%5CnThis%20is%20sort%20of%20in-between.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A43%3A13Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22Switched%20to%20try%20and%20use%20component%20everywhere%20it%20makes%20any%20kind%20of%20sense.%5Cr%5Cn%5Cr%5CnIt%27s%20a%20bit%20wonky%20but%20probably%20the%20best%20of%20bad%20options.%22%2C%20%22created_at%22%3A%20%222015-12-09T05%3A02%3A56Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T05%3A02%3A59Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20211%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924201%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22I%27d%20add%20a%20%5C%22historical%20note%5C%22.%5Cr%5Cn%5Cr%5CnAlso%2C%20is%20it%20confusing%20that%20you%20can%27t%20access%20%60name%60%20or%20%60color%60%20above%20from%20a%20helper%3F%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A05%3A05Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Let%20me%20know%20what%20you%20think.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A37%3A33Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A34%3A21Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20420%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042317%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22It%27s%20%60%7B%7BTemplate.subscriptionsReady%7D%7D%60%20inside%20Spacebars%2C%20and%20%60Template.instance%28%29.subscriptionsReady%28%29%60%20inside%20helpers.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A42%3A55Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A54%3A08Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20424%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042496%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22I%20guess%20the%20logic%20is%2C%20we%20want%20to%20do%20all%20%5C%22smart%5C%22%20things%20inside%20%60onCreated%60%20rather%20than%20inside%20helpers%3F%20One%20more%20way%20to%20achieve%20that%20would%20be%20to%20define%20a%20function%20inside%20%60onCreated%60%20like%3A%5Cr%5Cn%5Cr%5Cn%60%60%60js%5Cr%5Cnthis.getListId%20%3D%20%28%29%20%3D%3E%20FlowRouter.getParam%28%27_id%27%29%5Cr%5Cn%5Cr%5Cnthis.autorun%28%28%29%20%3D%3E%20%7B%5Cr%5Cn%20%20this.subscribe%28%27list/todos%27%2C%20this.getListId%28%29%29%3B%5Cr%5Cn%7D%29%3B%5Cr%5Cn%60%60%60%5Cr%5Cn%5Cr%5CnAnd%20then%20use%20that%20function%20inside%20the%20helper.%20That%20way%20if%20you%20need%20to%20get%20the%20listId%20from%20somewhere%20else%2C%20you%20don%27t%20need%20to%20change%20the%20helper%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A46%3A05Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22That%20seems%20like%20a%20very%20sensible%20approach%2C%20I%27ll%20make%20that%20change.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A54%3A39Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22https%3A//github.com/meteor/todos/commit/eabfb2535a393476c870373b8eb105bf08d3d315%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A58%3A54Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A58%3A57Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20427%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042585%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22If%20we%20fetch%20data%20in%20helpers%20from%20the%20database%2C%20why%20not%20fetch%20router%20data%20in%20there%20too%3F%20Alternatively%2C%20we%20could%20suggest%20wrapping%20cursors%20in%20functions%20in%20%60onCreated%60%20but%20that%20could%20be%20a%20bit%20much.%20This%20is%20making%20me%20think%20that%20accessing%20the%20router%20from%20the%20helper%20is%20OK.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A47%3A27Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22I%20think%20we%20agree%20on%20this.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A59%3A17Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A59%3A30Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20402%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042150%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Would%20also%20be%20good%20to%20mention%20the%20UX%20article%20about%20reusable/smart%20components%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A41%3A20Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A24%3A06Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20467%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r47042804%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Somewhere%20near%20the%20top%20of%20this%20we%20should%20mention%20that%20the%20intention%20is%20that%20helpers%20should%20be%20cheap%20to%20re-run%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A50%3A26Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Added%20something%2C%20lmk%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A02%3A08Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A29%3A23Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%2040%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46922856%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%5C%22will%20never%20render%20HTML%5C%22%20-%3E%20%5C%22will%20escape%20HTML%20for%20you%5C%22%5Cr%5Cn%5Cr%5CnI%20think%20any%20reasonable%20person%20would%20say%20they%20do%20render%20HTML%22%2C%20%22created_at%22%3A%20%222015-12-08T07%3A43%3A09Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A06%3A47Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20173%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924114%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22End%20template%20tag%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A03%3A57Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A22%3A53Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20179%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924129%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22H4%27s%20don%27t%20need%20IDs%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A04%3A10Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Can%20we%20not%20still%20link%20to%20them%20though%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A23%3A22Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22Not%20currently%2C%20but%20we%20could%20add%20that%20feature.%20Should%20we%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A37%3A57Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22I%20mean%2C%20can%20we%20literally%20not%20link%20to%20them%3F%20I%20think%20we%20can%3F%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A53%3A13Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22Yes%2C%20that%27s%20true%20-%20you%20could%20manually%20add%20the%20ID%20in%20the%20URL.%20I%20just%20mean%20that%20the%20little%20link%20button%20doesn%27t%20show%20up.%20I%27ll%20need%20to%20modify%20my%20H4s%20to%20have%20good%20IDs%20then.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A56%3A49Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A24%3A18Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20380%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46924901%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22Should%20this%20be%20%60Template.instance%28%29.data.onEdit%60%3F%20If%20you%20use%20any%20of%20the%20data%20context%20changing%20block%20helpers%20it%20won%27t%20work%20anymore.%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A14%3A15Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22Yeah%20but%20we%20say%20not%20to%20do%20that.%20I%27m%20not%20sure.%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A51%3A08Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%3Ca%20href%3D%27%23crh-update-complete%27%3E%3C/a%3E%22%2C%20%22created_at%22%3A%20%222015-12-09T02%3A38%3A49Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%2C%20%22Pull%20b9291f572b55c3a2226763991b8268d67efd7384%20content/blaze.md%20132%22%3A%20%7B%22html_url%22%3A%20%22https%3A//github.com/meteor/guide/pull/139%23discussion_r46923988%22%2C%20%22comments%22%3A%20%5B%7B%22body%22%3A%20%22%60attributes%28%29%20%7B%20...%20%7D%60%2C%20not%20arrow%20function%20here%22%2C%20%22created_at%22%3A%20%222015-12-08T08%3A02%3A30Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/448783%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/stubailo%22%7D%7D%2C%20%7B%22body%22%3A%20%22%3A%2B1%3A%20%22%2C%20%22created_at%22%3A%20%222015-12-09T01%3A22%3A11Z%22%2C%20%22user%22%3A%20%7B%22avatar_url%22%3A%20%22https%3A//avatars.githubusercontent.com/u/132554%3Fv%3D3%22%2C%20%22html_url%22%3A%20%22https%3A//github.com/tmeasday%22%7D%7D%5D%2C%20%22title%22%3A%20%22File%3A%20content/blaze.md%3AL1-544%22%7D%7D%7D'></a>\n<a href='https://www.codereviewhub.com/'><img src='http://www.codereviewhub.com/site/github-bar.png' height=40></a>\n- [ ] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 239'></a> <img src='http://www.codereviewhub.com/site/github-remaining.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924409'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> \n```js\nnew SimpleSchema({\nlist: {blackbox: true},\ntodosReady: {type: Boolean}\n}).validate(Template.data());\n```\nThis works fine, we don't need to call `check`.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Yeah. We just need to make sure it actually works (right now it throws due to the `list` failing the object test)\n- [ ] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 438'></a> <img src='http://www.codereviewhub.com/site/github-remaining.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47042669'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> I'm not sure what this is recommending - should the functionality be factored out into a wrapper component?\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Oh, I guess I was thinking of composition, if you can figure out a way to make it a child component. A wrapper component is sort of like complex composition, works too..\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> I should probably think of an example here and demo it. Any ideas?\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> I guess a common thing can be having some complex state or event handler logic. For example, you want to do auto-completing user search, and you want this to work inside a text area to tag users, or in a user selector somewhere.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 7'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46922770'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Hmm, technically they are Spacebars templates, Blaze is just the underlying rendering engine... what do you think? Too pedantic? People use the word \"Blaze\" to refer to the whole thing these days.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 40'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46922856'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> \"will never render HTML\" -> \"will escape HTML for you\"\nI think any reasonable person would say they do render HTML\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 52'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46923841'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Data context of the element where the helper was used, not the template.\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Also, I feel like we should discourage using `this` inside helpers in favor of passing arguments or using `Template.instance().data`\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> What do you think now?\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> I don't think you pushed your change yet.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Yeah I write the comments as I go through the file and then push at the end, sorry. Pushed now.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 122'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46923962'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> \"include an object as part of an HTML to apply multiple properties at once:\" -> \"Include an object in the attribute list of an HTML element to set multiple attributes at once.\"\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 132'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46923988'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> `attributes() { ... }`, not arrow function here\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 142'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924033'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> mustance -> mustache\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 159'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924063'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> `eachBlock` -> `elseBlock`\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 173'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924114'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> End template tag\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 179'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924129'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> H4's don't need IDs\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Can we not still link to them though?\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Not currently, but we could add that feature. Should we?\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> I mean, can we literally not link to them? I think we can?\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Yes, that's true - you could manually add the ID in the URL. I just mean that the little link button doesn't show up. I'll need to modify my H4s to have good IDs then.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 211'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924201'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> I'd add a \"historical note\".\nAlso, is it confusing that you can't access `name` or `color` above from a helper?\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Let me know what you think.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 217'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924273'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Whoa, I had no idea... this would really simplify some stuff in the docs app lol\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> This is like basically copied out of the spacebars docs.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 214'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924305'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> You also need to close tags that don't need to be closed in HTML5, like `<p>`.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 243'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924466'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> This sentence is janky\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Hmm, what would you say instead?\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 258'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924524'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> sub-component -> sub-template? Not sure if we are using the word component to refer to Blaze entities\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> I think I'm pretty inconsistent in this article. I've used component more or less everywhere else in the guide. It's hard to know what to use in this article, sometimes it seems like it should be component (like when talking about \"reusability\"), other times template (when talking about technicalities with Blaze).\nThis is sort of in-between.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Switched to try and use component everywhere it makes any kind of sense.\nIt's a bit wonky but probably the best of bad options.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 261'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924580'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> \"Although Blaze doesn't currently have a fully baked component model\" is overly negative IMO. Plus I bet certain people would disagree with this statement.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Better?\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 272'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924665'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> `doEdit` is a super weird variable name. Not sure what it does. Maybe this is `onFocusChange` and `focusStatus` or `onEditingStateChange` and `editingState`? Or maybe even `onFocus`/`onBlur`.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> How about just `onEditingChange` and `editing`?\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Sounds good!\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 380'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r46924901'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Should this be `Template.instance().data.onEdit`? If you use any of the data context changing block helpers it won't work anymore.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Yeah but we say not to do that. I'm not sure.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 402'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47042150'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Would also be good to mention the UX article about reusable/smart components\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 420'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47042317'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> It's `{{Template.subscriptionsReady}}` inside Spacebars, and `Template.instance().subscriptionsReady()` inside helpers.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 424'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47042496'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> I guess the logic is, we want to do all \"smart\" things inside `onCreated` rather than inside helpers? One more way to achieve that would be to define a function inside `onCreated` like:\n```js\nthis.getListId = () => FlowRouter.getParam('_id')\nthis.autorun(() => {\nthis.subscribe('list/todos', this.getListId());\n});\n```\nAnd then use that function inside the helper. That way if you need to get the listId from somewhere else, you don't need to change the helper?\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> That seems like a very sensible approach, I'll make that change.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> https://github.com/meteor/todos/commit/eabfb2535a393476c870373b8eb105bf08d3d315\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 427'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47042585'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> If we fetch data in helpers from the database, why not fetch router data in there too? Alternatively, we could suggest wrapping cursors in functions in `onCreated` but that could be a bit much. This is making me think that accessing the router from the helper is OK.\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> I think we agree on this.\n- [x] <a href='#crh-comment-Pull b9291f572b55c3a2226763991b8268d67efd7384 content/blaze.md 467'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47042804'>File: content/blaze.md:L1-544</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> Somewhere near the top of this we should mention that the intention is that helpers should be cheap to re-run\n- <a href='https://github.com/tmeasday'><img border=0 src='https://avatars.githubusercontent.com/u/132554?v=3' height=16 width=16'></a> Added something, lmk\n- [x] <a href='#crh-comment-Pull 1cc46ddc6efbc431ff7243bb3a73a28c36863b20 content/blaze.md 249'></a> <img src='http://www.codereviewhub.com/site/github-completed.png' height=16 width=60>&nbsp;<b><a href='https://github.com/meteor/guide/pull/139#discussion_r47045382'>File: content/blaze.md:L1-561</a></b>\n- <a href='https://github.com/stubailo'><img border=0 src='https://avatars.githubusercontent.com/u/448783?v=3' height=16 width=16'></a> We use an `autorun()` to make sure that the data context is validated again whenever it changes.\n\n\n<a href='https://www.codereviewhub.com/meteor/guide/pull/139?mark_as_completed=1'><img src='http://www.codereviewhub.com/site/github-mark-as-completed.png' height=26></a>&nbsp;<a href='https://www.codereviewhub.com/meteor/guide/pull/139?approve=1'><img src='http://www.codereviewhub.com/site/github-approve.png' height=26></a>&nbsp;<a href='https://github.com/meteor/guide/pull/139'><img src='http://www.codereviewhub.com/site/github-refresh.png' height=26></a>\n<a href='#crh-end'></a>","created_at":"2015-12-08T06:47:37Z","updated_at":"2015-12-09T05:11:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"54afb30b1bfbec6dcb087a3609a1787749e38865","assignee":{"login":"stubailo","id":448783,"avatar_url":"https://avatars.githubusercontent.com/u/448783?v=3","gravatar_id":"","url":"https://api.github.com/users/stubailo","html_url":"https://github.com/stubailo","followers_url":"https://api.github.com/users/stubailo/followers","following_url":"https://api.github.com/users/stubailo/following{/other_user}","gists_url":"https://api.github.com/users/stubailo/gists{/gist_id}","starred_url":"https://api.github.com/users/stubailo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stubailo/subscriptions","organizations_url":"https://api.github.com/users/stubailo/orgs","repos_url":"https://api.github.com/users/stubailo/repos","events_url":"https://api.github.com/users/stubailo/events{/privacy}","received_events_url":"https://api.github.com/users/stubailo/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/meteor/guide/pulls/139/commits","review_comments_url":"https://api.github.com/repos/meteor/guide/pulls/139/comments","review_comment_url":"https://api.github.com/repos/meteor/guide/pulls/comments{/number}","comments_url":"https://api.github.com/repos/meteor/guide/issues/139/comments","statuses_url":"https://api.github.com/repos/meteor/guide/statuses/00d6072fabdd9483c021fbaf0b37e04477ce5f65","head":{"label":"meteor:blaze-content","ref":"blaze-content","sha":"00d6072fabdd9483c021fbaf0b37e04477ce5f65","user":{"login":"meteor","id":789528,"avatar_url":"https://avatars.githubusercontent.com/u/789528?v=3","gravatar_id":"","url":"https://api.github.com/users/meteor","html_url":"https://github.com/meteor","followers_url":"https://api.github.com/users/meteor/followers","following_url":"https://api.github.com/users/meteor/following{/other_user}","gists_url":"https://api.github.com/users/meteor/gists{/gist_id}","starred_url":"https://api.github.com/users/meteor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteor/subscriptions","organizations_url":"https://api.github.com/users/meteor/orgs","repos_url":"https://api.github.com/users/meteor/repos","events_url":"https://api.github.com/users/meteor/events{/privacy}","received_events_url":"https://api.github.com/users/meteor/received_events","type":"Organization","site_admin":false},"repo":{"id":43717321,"name":"guide","full_name":"meteor/guide","owner":{"login":"meteor","id":789528,"avatar_url":"https://avatars.githubusercontent.com/u/789528?v=3","gravatar_id":"","url":"https://api.github.com/users/meteor","html_url":"https://github.com/meteor","followers_url":"https://api.github.com/users/meteor/followers","following_url":"https://api.github.com/users/meteor/following{/other_user}","gists_url":"https://api.github.com/users/meteor/gists{/gist_id}","starred_url":"https://api.github.com/users/meteor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteor/subscriptions","organizations_url":"https://api.github.com/users/meteor/orgs","repos_url":"https://api.github.com/users/meteor/repos","events_url":"https://api.github.com/users/meteor/events{/privacy}","received_events_url":"https://api.github.com/users/meteor/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/meteor/guide","description":"How do I use Meteor? (Work in progress)","fork":false,"url":"https://api.github.com/repos/meteor/guide","forks_url":"https://api.github.com/repos/meteor/guide/forks","keys_url":"https://api.github.com/repos/meteor/guide/keys{/key_id}","collaborators_url":"https://api.github.com/repos/meteor/guide/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/meteor/guide/teams","hooks_url":"https://api.github.com/repos/meteor/guide/hooks","issue_events_url":"https://api.github.com/repos/meteor/guide/issues/events{/number}","events_url":"https://api.github.com/repos/meteor/guide/events","assignees_url":"https://api.github.com/repos/meteor/guide/assignees{/user}","branches_url":"https://api.github.com/repos/meteor/guide/branches{/branch}","tags_url":"https://api.github.com/repos/meteor/guide/tags","blobs_url":"https://api.github.com/repos/meteor/guide/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/meteor/guide/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/meteor/guide/git/refs{/sha}","trees_url":"https://api.github.com/repos/meteor/guide/git/trees{/sha}","statuses_url":"https://api.github.com/repos/meteor/guide/statuses/{sha}","languages_url":"https://api.github.com/repos/meteor/guide/languages","stargazers_url":"https://api.github.com/repos/meteor/guide/stargazers","contributors_url":"https://api.github.com/repos/meteor/guide/contributors","subscribers_url":"https://api.github.com/repos/meteor/guide/subscribers","subscription_url":"https://api.github.com/repos/meteor/guide/subscription","commits_url":"https://api.github.com/repos/meteor/guide/commits{/sha}","git_commits_url":"https://api.github.com/repos/meteor/guide/git/commits{/sha}","comments_url":"https://api.github.com/repos/meteor/guide/comments{/number}","issue_comment_url":"https://api.github.com/repos/meteor/guide/issues/comments{/number}","contents_url":"https://api.github.com/repos/meteor/guide/contents/{+path}","compare_url":"https://api.github.com/repos/meteor/guide/compare/{base}...{head}","merges_url":"https://api.github.com/repos/meteor/guide/merges","archive_url":"https://api.github.com/repos/meteor/guide/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/meteor/guide/downloads","issues_url":"https://api.github.com/repos/meteor/guide/issues{/number}","pulls_url":"https://api.github.com/repos/meteor/guide/pulls{/number}","milestones_url":"https://api.github.com/repos/meteor/guide/milestones{/number}","notifications_url":"https://api.github.com/repos/meteor/guide/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/meteor/guide/labels{/name}","releases_url":"https://api.github.com/repos/meteor/guide/releases{/id}","created_at":"2015-10-05T22:26:02Z","updated_at":"2015-12-09T05:03:48Z","pushed_at":"2015-12-09T05:01:57Z","git_url":"git://github.com/meteor/guide.git","ssh_url":"git@github.com:meteor/guide.git","clone_url":"https://github.com/meteor/guide.git","svn_url":"https://github.com/meteor/guide","homepage":"http://guide.meteor.com/","size":4004,"stargazers_count":406,"watchers_count":406,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":30,"mirror_url":null,"open_issues_count":80,"forks":30,"open_issues":80,"watchers":406,"default_branch":"master"}},"base":{"label":"meteor:master","ref":"master","sha":"91ac24390f7dce92f940379cb32e02e79677085b","user":{"login":"meteor","id":789528,"avatar_url":"https://avatars.githubusercontent.com/u/789528?v=3","gravatar_id":"","url":"https://api.github.com/users/meteor","html_url":"https://github.com/meteor","followers_url":"https://api.github.com/users/meteor/followers","following_url":"https://api.github.com/users/meteor/following{/other_user}","gists_url":"https://api.github.com/users/meteor/gists{/gist_id}","starred_url":"https://api.github.com/users/meteor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteor/subscriptions","organizations_url":"https://api.github.com/users/meteor/orgs","repos_url":"https://api.github.com/users/meteor/repos","events_url":"https://api.github.com/users/meteor/events{/privacy}","received_events_url":"https://api.github.com/users/meteor/received_events","type":"Organization","site_admin":false},"repo":{"id":43717321,"name":"guide","full_name":"meteor/guide","owner":{"login":"meteor","id":789528,"avatar_url":"https://avatars.githubusercontent.com/u/789528?v=3","gravatar_id":"","url":"https://api.github.com/users/meteor","html_url":"https://github.com/meteor","followers_url":"https://api.github.com/users/meteor/followers","following_url":"https://api.github.com/users/meteor/following{/other_user}","gists_url":"https://api.github.com/users/meteor/gists{/gist_id}","starred_url":"https://api.github.com/users/meteor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/meteor/subscriptions","organizations_url":"https://api.github.com/users/meteor/orgs","repos_url":"https://api.github.com/users/meteor/repos","events_url":"https://api.github.com/users/meteor/events{/privacy}","received_events_url":"https://api.github.com/users/meteor/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/meteor/guide","description":"How do I use Meteor? (Work in progress)","fork":false,"url":"https://api.github.com/repos/meteor/guide","forks_url":"https://api.github.com/repos/meteor/guide/forks","keys_url":"https://api.github.com/repos/meteor/guide/keys{/key_id}","collaborators_url":"https://api.github.com/repos/meteor/guide/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/meteor/guide/teams","hooks_url":"https://api.github.com/repos/meteor/guide/hooks","issue_events_url":"https://api.github.com/repos/meteor/guide/issues/events{/number}","events_url":"https://api.github.com/repos/meteor/guide/events","assignees_url":"https://api.github.com/repos/meteor/guide/assignees{/user}","branches_url":"https://api.github.com/repos/meteor/guide/branches{/branch}","tags_url":"https://api.github.com/repos/meteor/guide/tags","blobs_url":"https://api.github.com/repos/meteor/guide/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/meteor/guide/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/meteor/guide/git/refs{/sha}","trees_url":"https://api.github.com/repos/meteor/guide/git/trees{/sha}","statuses_url":"https://api.github.com/repos/meteor/guide/statuses/{sha}","languages_url":"https://api.github.com/repos/meteor/guide/languages","stargazers_url":"https://api.github.com/repos/meteor/guide/stargazers","contributors_url":"https://api.github.com/repos/meteor/guide/contributors","subscribers_url":"https://api.github.com/repos/meteor/guide/subscribers","subscription_url":"https://api.github.com/repos/meteor/guide/subscription","commits_url":"https://api.github.com/repos/meteor/guide/commits{/sha}","git_commits_url":"https://api.github.com/repos/meteor/guide/git/commits{/sha}","comments_url":"https://api.github.com/repos/meteor/guide/comments{/number}","issue_comment_url":"https://api.github.com/repos/meteor/guide/issues/comments{/number}","contents_url":"https://api.github.com/repos/meteor/guide/contents/{+path}","compare_url":"https://api.github.com/repos/meteor/guide/compare/{base}...{head}","merges_url":"https://api.github.com/repos/meteor/guide/merges","archive_url":"https://api.github.com/repos/meteor/guide/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/meteor/guide/downloads","issues_url":"https://api.github.com/repos/meteor/guide/issues{/number}","pulls_url":"https://api.github.com/repos/meteor/guide/pulls{/number}","milestones_url":"https://api.github.com/repos/meteor/guide/milestones{/number}","notifications_url":"https://api.github.com/repos/meteor/guide/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/meteor/guide/labels{/name}","releases_url":"https://api.github.com/repos/meteor/guide/releases{/id}","created_at":"2015-10-05T22:26:02Z","updated_at":"2015-12-09T05:03:48Z","pushed_at":"2015-12-09T05:01:57Z","git_url":"git://github.com/meteor/guide.git","ssh_url":"git@github.com:meteor/guide.git","clone_url":"https://github.com/meteor/guide.git","svn_url":"https://github.com/meteor/guide","homepage":"http://guide.meteor.com/","size":4004,"stargazers_count":406,"watchers_count":406,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":30,"mirror_url":null,"open_issues_count":80,"forks":30,"open_issues":80,"watchers":406,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/meteor/guide/pulls/139"},"html":{"href":"https://github.com/meteor/guide/pull/139"},"issue":{"href":"https://api.github.com/repos/meteor/guide/issues/139"},"comments":{"href":"https://api.github.com/repos/meteor/guide/issues/139/comments"},"review_comments":{"href":"https://api.github.com/repos/meteor/guide/pulls/139/comments"},"review_comment":{"href":"https://api.github.com/repos/meteor/guide/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/meteor/guide/pulls/139/commits"},"statuses":{"href":"https://api.github.com/repos/meteor/guide/statuses/00d6072fabdd9483c021fbaf0b37e04477ce5f65"}}}}