I have a knockout template that was working fine until I made a minor change to it for display purposes. Now the HTML is rendering differently which is causing some of my SCSS to not apply certain styles. Here is the current template:
<script type="text/html" id="dropDownTextBoxTemplate">
<div class="top-level-div-class">
<p class="paragraph-class">
<div>
<label data-bind="text: DisplayValue"></label>
</div>
<div>
<select data-bind="attr: { id: Name, name: Name }, options: Comparisons, optionsValue: 'Name', optionsText: 'DisplayValue', optionsCaption: 'Unselected', value: SelectedComparison"></select>
<!-- ko if: SelectedComparison() === undefined -->
<input type="text" disabled="disabled" data-bind="attr: { id: Name + '-value', name: Name + '-value', 'data-min-value': TextboxMinValue, 'data-max-value': TextboxMaxValue, 'data-format': TextboxFormat }, value: TextboxValue" />
<!-- /ko -->
<!-- ko ifnot: SelectedComparison() === undefined -->
<input type="text" data-bind="attr: { id: Name + '-value', name: Name + '-value', 'data-min-value': TextboxMinValue, 'data-max-value': TextboxMaxValue, 'data-format': TextboxFormat }, value: TextboxValue" />
<!-- /ko -->
</div>
</p>
</div>
</script>
The change I made was to add the div tags around the label, select and input controls. Here is the HTML that is rendered.
<div class="top-level-div-class">
<p class="paragraph-class"></p>
<div>
<label data-bind="text: DisplayValue">My Display Value:</label>
</div>
<div>
<select data-bind="attr: { id: Name, name: Name }, options: Comparisons, optionsValue: 'Name', optionsText: 'DisplayValue', optionsCaption: 'Unselected', value: SelectedComparison" id="attendence" name="attendence">
<option value="">Unselected</option>
<option value="gtet">Greater than or equal to</option>
<option value="ltet">Less than or equal to</option>
</select>
<!-- ko if: SelectedComparison() === undefined -->
<input type="text" disabled="disabled" data-bind="attr: { id: Name + '-value', name: Name + '-value', 'data-min-value': TextboxMinValue, 'data-max-value': TextboxMaxValue, 'data-format': TextboxFormat }, value: TextboxValue" id="attendence-value" name="attendence-value" data-min-value="0" data-max-value="99" data-format="range">
<!-- /ko -->
<!-- ko ifnot: SelectedComparison() === undefined -->
<!-- /ko -->
</div>
<p></p>
</div>
As you can see the paragraph tag is rendered by itself instead of being around the content as it is in the template. When the extra div's are removed the paragraph tag renders around all of the other content, which is the desired HTML output, but when I do that the UI elements don't align properly. I have tried replacing the extra div's with span tags and the HTML does render properly but once again the UI controls are out of alignment. Any help would be appreciated.
Try using the paragraph tag as div. Its not allowed to enclose divs inside paragraph tags.
here is the change you should try.
<script type="text/html" id="dropDownTextBoxTemplate">
<div class="top-level-div-class">
<div class="paragraph-class">
<div>
<label data-bind="text: DisplayValue"></label>
</div>
<div>
<select data-bind="attr: { id: Name, name: Name }, options: Comparisons, optionsValue: 'Name', optionsText: 'DisplayValue', optionsCaption: 'Unselected', value: SelectedComparison"></select>
<!-- ko if: SelectedComparison() === undefined -->
<input type="text" disabled="disabled" data-bind="attr: { id: Name + '-value', name: Name + '-value', 'data-min-value': TextboxMinValue, 'data-max-value': TextboxMaxValue, 'data-format': TextboxFormat }, value: TextboxValue" />
<!-- /ko -->
<!-- ko ifnot: SelectedComparison() === undefined -->
<input type="text" data-bind="attr: { id: Name + '-value', name: Name + '-value', 'data-min-value': TextboxMinValue, 'data-max-value': TextboxMaxValue, 'data-format': TextboxFormat }, value: TextboxValue" />
<!-- /ko -->
</div>
</div>
</div>
</script>