-
-
Save strathmeyer/1371586 to your computer and use it in GitHub Desktop.
| // HELPER: #key_value | |
| // | |
| // Usage: {{#key_value obj}} Key: {{key}} // Value: {{value}} {{/key_value}} | |
| // | |
| // Iterate over an object, setting 'key' and 'value' for each property in | |
| // the object. | |
| Handlebars.registerHelper("key_value", function(obj, fn) { | |
| var buffer = "", | |
| key; | |
| for (key in obj) { | |
| if (obj.hasOwnProperty(key)) { | |
| buffer += fn({key: key, value: obj[key]}); | |
| } | |
| } | |
| return buffer; | |
| }); | |
| // HELPER: #each_with_key | |
| // | |
| // Usage: {{#each_with_key container key="myKey"}}...{{/each_with_key}} | |
| // | |
| // Iterate over an object containing other objects. Each | |
| // inner object will be used in turn, with an added key ("myKey") | |
| // set to the value of the inner object's key in the container. | |
| Handlebars.registerHelper("each_with_key", function(obj, fn) { | |
| var context, | |
| buffer = "", | |
| key, | |
| keyName = fn.hash.key; | |
| for (key in obj) { | |
| if (obj.hasOwnProperty(key)) { | |
| context = obj[key]; | |
| if (keyName) { | |
| context[keyName] = key; | |
| } | |
| buffer += fn(context); | |
| } | |
| } | |
| return buffer; | |
| }); |
This is a helper that really should be apart of the Handlebars core API.
I think that starting from 2.x release, callback should be function(obj, options) and instead of fn(), one should use options.fn()
I made those changes in a fork and it is now working for me. I agree it should be included in handlebars core API.
Agree with pdeschen, the code in this gist is buggy and that's how I fixed it too.
Great helper! should be included in core.
Thanks strathmeyer
Coffeescript version of key_value which worked for me:
Handlebars.registerHelper 'key_value', (obj, hash) ->
buffer = ""
for key of obj
if obj.hasOwnProperty(key)
buffer += hash.fn({ key: key, value: obj[key] })
buffer@kowal You can simplify that code a bit:
Handlebars.registerHelper 'key_value', (obj, hash) ->
buffer = ""
for own key, value of obj
buffer += hash.fn({ key, value })
bufferIn the case of there being an empty string template between the key_value tag pair, this will output undefined for each property in the object being iterated. I think it is best practice to avoid this, and it can be done by defaulting to an empty string if the return of hash.fn({ key, value }) is falsey. See below:
CS
Handlebars.registerHelper 'key_value', (obj, hash) ->
buffer = ""
for own key, value of obj
buffer += hash.fn({ key, value }) || ''
buffer
JS
Handlebars.registerHelper('key_value', function (obj, hash) {
var buffer, key, value;
buffer = "";
for (key in obj) {
if (!Object.hasOwnProperty.call(obj, key)) {
continue;
}
buffer += hash.fn({
key: key,
value: obj[key]
}) || '';
}
return buffer;
});
This is a helper that really should be apart of the Handlebars core API.
Handlebars now supports looping objects, but as far as i know ember does not
This is a helper that really should be apart of the Handlebars core API.