From 63421744b80eb192dabc97cf2d3a7511e0e72289 Mon Sep 17 00:00:00 2001 From: Brian Takita Date: Mon, 19 Mar 2018 22:07:43 -0400 Subject: [PATCH] Implement bind:checked & bind:indeterminate on input[type=radio] https://github.com/sveltejs/svelte/issues/1104 https://github.com/sveltejs/svelte/issues/1263 --- src/validate/html/validateElement.ts | 5 ++- .../_config.js | 42 +++++++++++++++++++ .../main.html | 3 ++ .../samples/binding-input-checked/errors.json | 4 +- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 test/runtime/samples/binding-input-radio-indeterminate/_config.js create mode 100644 test/runtime/samples/binding-input-radio-indeterminate/main.html diff --git a/src/validate/html/validateElement.ts b/src/validate/html/validateElement.ts index 9172854c7a..6b4ff2dd6d 100644 --- a/src/validate/html/validateElement.ts +++ b/src/validate/html/validateElement.ts @@ -111,9 +111,10 @@ export default function validateElement( ); } - if (checkTypeAttribute(validator, node) !== 'checkbox') { + const checkTypeAttribute__ = checkTypeAttribute(validator, node); + if (checkTypeAttribute__ !== 'checkbox' && checkTypeAttribute__ !== 'radio') { validator.error( - `'${name}' binding can only be used with `, + `'${name}' binding can only be used with or `, attribute ); } diff --git a/test/runtime/samples/binding-input-radio-indeterminate/_config.js b/test/runtime/samples/binding-input-radio-indeterminate/_config.js new file mode 100644 index 0000000000..99f0b82bf8 --- /dev/null +++ b/test/runtime/samples/binding-input-radio-indeterminate/_config.js @@ -0,0 +1,42 @@ +export default { + 'skip-ssr': true, + + data: { + indeterminate: true, + }, + + html: ` + +

checked? false

+

indeterminate? true

+ `, + + test(assert, component, target, window) { + const input = target.querySelector('input'); + assert.equal(input.checked, false); + assert.equal(input.indeterminate, true); + + const event = new window.Event('change'); + + input.checked = true; + input.indeterminate = false; + input.dispatchEvent(event); + + assert.equal(component.get('indeterminate'), false); + assert.equal(component.get('checked'), true); + assert.htmlEqual(target.innerHTML, ` + +

checked? true

+

indeterminate? false

+ `); + + component.set({ indeterminate: true }); + assert.equal(input.indeterminate, true); + assert.equal(input.checked, true); + assert.htmlEqual(target.innerHTML, ` + +

checked? true

+

indeterminate? true

+ `); + }, +}; diff --git a/test/runtime/samples/binding-input-radio-indeterminate/main.html b/test/runtime/samples/binding-input-radio-indeterminate/main.html new file mode 100644 index 0000000000..230f37ef21 --- /dev/null +++ b/test/runtime/samples/binding-input-radio-indeterminate/main.html @@ -0,0 +1,3 @@ + +

checked? {{checked}}

+

indeterminate? {{indeterminate}}

diff --git a/test/validator/samples/binding-input-checked/errors.json b/test/validator/samples/binding-input-checked/errors.json index 477181e40c..ae712c9aec 100644 --- a/test/validator/samples/binding-input-checked/errors.json +++ b/test/validator/samples/binding-input-checked/errors.json @@ -1,5 +1,5 @@ [{ - "message": "'checked' binding can only be used with ", + "message": "'checked' binding can only be used with or ", "loc": { "line": 1, "column": 7 @@ -9,4 +9,4 @@ "column": 25 }, "pos": 7 -}] \ No newline at end of file +}]