fix(ivy): not applying camelCased style properties (#28276)
Fixes Ivy not applying properties that are set in camelCase, because it goes through the `CSSStyleDeclaration` API via `setProperty` and `removeProperty` which requires for [the values to be in dash-case](https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleDeclaration/setProperty). **Note:** I opted to let the browser normalize the value, rather than convert it to dash-case during compile time, because there are some special cases like browser-prefixed properties where we might not normalize it in-line with the browser. This PR fixes FW-579. PR Close #28276
This commit is contained in:
parent
18a9afc738
commit
ea1b5c100f
@ -951,12 +951,12 @@ export function setStyle(
|
|||||||
ngDevMode && ngDevMode.rendererSetStyle++;
|
ngDevMode && ngDevMode.rendererSetStyle++;
|
||||||
isProceduralRenderer(renderer) ?
|
isProceduralRenderer(renderer) ?
|
||||||
renderer.setStyle(native, prop, value, RendererStyleFlags3.DashCase) :
|
renderer.setStyle(native, prop, value, RendererStyleFlags3.DashCase) :
|
||||||
native['style'].setProperty(prop, value);
|
native.style[prop] = value;
|
||||||
} else {
|
} else {
|
||||||
ngDevMode && ngDevMode.rendererRemoveStyle++;
|
ngDevMode && ngDevMode.rendererRemoveStyle++;
|
||||||
isProceduralRenderer(renderer) ?
|
isProceduralRenderer(renderer) ?
|
||||||
renderer.removeStyle(native, prop, RendererStyleFlags3.DashCase) :
|
renderer.removeStyle(native, prop, RendererStyleFlags3.DashCase) :
|
||||||
native['style'].removeProperty(prop);
|
native.style[prop] = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +380,41 @@ describe('style and class based bindings', () => {
|
|||||||
.toEqual(
|
.toEqual(
|
||||||
'<svg style="height: 100px; width: 100px;"><circle fill="yellow" stroke="green"></circle></svg>');
|
'<svg style="height: 100px; width: 100px;"><circle fill="yellow" stroke="green"></circle></svg>');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should support binding to camelCased style properties', () => {
|
||||||
|
// <div [style.borderWidth]="borderWidth"></div>
|
||||||
|
class Comp {
|
||||||
|
borderWidth: string = '3px';
|
||||||
|
|
||||||
|
static ngComponentDef = defineComponent({
|
||||||
|
type: Comp,
|
||||||
|
selectors: [['comp']],
|
||||||
|
factory: () => new Comp(),
|
||||||
|
consts: 1,
|
||||||
|
vars: 0,
|
||||||
|
template: (rf: RenderFlags, ctx: Comp) => {
|
||||||
|
if (rf & RenderFlags.Create) {
|
||||||
|
elementStart(0, 'div');
|
||||||
|
elementStyling(null, ['borderWidth']);
|
||||||
|
elementEnd();
|
||||||
|
}
|
||||||
|
if (rf & RenderFlags.Update) {
|
||||||
|
elementStyleProp(0, 0, ctx.borderWidth);
|
||||||
|
elementStylingApply(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const fixture = new ComponentFixture(Comp);
|
||||||
|
fixture.update();
|
||||||
|
|
||||||
|
const target = fixture.hostElement.querySelector('div') !as any;
|
||||||
|
|
||||||
|
expect(target.style.borderWidth).toEqual('3px');
|
||||||
|
expect(fixture.html).toEqual('<div style="border-width: 3px;"></div>');
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('dynamic styling properties within a styling context', () => {
|
describe('dynamic styling properties within a styling context', () => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user