Repository: bem/bh
Pull request #145 (2015-05-01 22:05:44)

Задание атрибута вида <input required>
Хотелось бы иметь возможность задавать атрибут без значения:

```html
<input required disabled hidden>
```

Сейчас приходится использовать вариант `required="required"`.

coveralls: 
[![Coverage Status](https://coveralls.io/builds/2469499/badge)](https://coveralls.io/builds/2469499)

Coverage decreased (-0.26%) to 99.74% when pulling **bbcd3bb2be835332070505b0721a801939061487 on sameoldmadness:feature/set-boolean-attrs** into **8f49e4aa643dcd165be2ac1992f91ad8fd57cf7d on bem:master**.

zxqfox: На первый взгляд — логично, вспоминая булевые модификаторы.

Но если `true` — пусто, то `false` — ?

И тест бы. ;-)
blond: > Но если true — пусто, то false — ?

Если `false`, `undefined` или `null` то атрибут совсем не попадает в html.
sameoldmadness: Смогу прилично оформить пулл-реквест после 9 мая.

Добавлю проверку на `=== false`, тест и пример в ридми.
coveralls: 
[![Coverage Status](https://coveralls.io/builds/2526525/badge)](https://coveralls.io/builds/2526525)

Coverage remained the same at 100.0% when pulling **c829f01913b40ed242998802a102cfcef95e2d30 on sameoldmadness:feature/set-boolean-attrs** into **8f49e4aa643dcd165be2ac1992f91ad8fd57cf7d on bem:master**.


Patch:
diff --git a/README.md b/README.md
index c66dc91..eb23070 100644
--- a/README.md
+++ b/README.md
@@ -375,6 +375,14 @@ bh.match('link', function(ctx) {
 });
 ```
 
+*N.B.* Pass `true` as a second parameter to set a boolean attribute:
+
+```javascript
+bh.match('link_hidden_yes', function(ctx) {
+    ctx.attr('hidden', true);
+});
+```
+
 ## ctx.attrs([values[, force]])
 
 This class method returns/sets attributes depending on arguments. Use **force** to set the attributes even if they were specified earlier.
diff --git a/README.ru.md b/README.ru.md
index 0b44d4b..44930c0 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -366,6 +366,14 @@ bh.match('link', function(ctx) {
 });
 ```
 
+*Замечание:* Чтобы задать булевый атрибут, следует передать вторым параметром `true`:
+
+```javascript
+bh.match('link_hidden_yes', function(ctx) {
+    ctx.attr('hidden', true);
+});
+```
+
 ## ctx.attrs([values[, force]])
 
 Возвращает/устанавливает атрибуты в зависимости от аргументов. **force** — задать атрибуты, даже если они были заданы ранее.
diff --git a/lib/bh.js b/lib/bh.js
index 22afe64..2eaea42 100644
--- a/lib/bh.js
+++ b/lib/bh.js
@@ -991,7 +991,9 @@ BH.prototype = {
             if (jattr = json.attrs) {
                 for (i in jattr) {
                     jval = jattr[i];
-                    if (jval !== null && jval !== undefined) {
+                    if (jval === true) {
+                        attrs += ' ' + i;
+                    } else if (jval !== false && jval !== null && jval !== undefined) {
                         attrs += ' ' + i + '="' + attrEscape(jval) + '"';
                     }
                 }


Test patch:
diff --git a/test/test.attr.js b/test/test.attr.js
index 97678bb..b464a0f 100644
--- a/test/test.attr.js
+++ b/test/test.attr.js
@@ -26,9 +26,10 @@ describe('ctx.attr()', function() {
             ctx.attr('name', undefined);
             ctx.attr('type', 'button');
             ctx.attr('disabled', false);
+            ctx.attr('hidden', true);
             ctx.attr('value', null);
         });
-        bh.apply({ block: 'checkbox' }).should.equal('<div class="checkbox" type="button" disabled="false"></div>');
+        bh.apply({ block: 'checkbox' }).should.equal('<div class="checkbox" type="button" hidden></div>');
     });
 
     it('should not override user attr', function() {
diff --git a/test/test.attrs.js b/test/test.attrs.js
index 69bc9a7..9d54656 100644
--- a/test/test.attrs.js
+++ b/test/test.attrs.js
@@ -24,12 +24,14 @@ describe('ctx.attrs()', function() {
     it('should set attrs', function() {
         bh.match('checkbox', function(ctx) {
             ctx.attrs({
+                name: undefined,
                 type: 'button',
                 disabled: false,
-                name: undefined
+                hidden: true,
+                value: null
             });
         });
-        bh.apply({ block: 'checkbox' }).should.equal('<div class="checkbox" type="button" disabled="false"></div>');
+        bh.apply({ block: 'checkbox' }).should.equal('<div class="checkbox" type="button" hidden></div>');
     });
 
     it('should not override user attrs', function() {