Directive Translation Cheat Sheet
|
AngularJS Pattern |
SolidJS Equivalent |
Critical Notes |
|---|---|---|
|
Interpolation |
||
|
|
|
✅ Auto-unwrapped if |
|
Conditionals |
||
|
|
|
✅ Use |
|
|
|
Or use CSS classes + |
|
Lists |
||
|
|
|
✅ Always use |
|
Forms |
||
|
|
|
Explicit unidirectional flow. ✅ Checkbox: |
|
Classes/Styles |
||
|
|
|
✅ Preferred method. Alternative: |
|
|
|
Object syntax only. |
|
Events |
||
|
|
|
✅ No |
|
Filters |
||
|
|
|
❌ No pipe syntax. ✅ Create helper functions/utils. |
AngularJS to SolidJS Template Migration
1. Expression Syntax
Classic:
<p>{{ user.name }}</p>
<button ng-click="doSomething()">Click</button>
Lightweight:
<p>{user.name}</p>
<button onClick={doSomething}>Click</button>
2. Conditionals
Classic:
<div ng-if="isVisible">Content</div>
<div ng-show="isVisible">Content</div>
Lightweight:
<Show when={isVisible}>
<div>Content</div>
</Show>
<div style={{ display: isVisible() ? 'block' : 'none' }}>
Content
</div>
3. Loops
Classic:
<ul>
<li ng-repeat="item in items" ng-class="{ active: item.selected }">
{{ item.name }}
</li>
</ul>
Lightweight:
<ul>
<For each={items}>
{(item) => (
<li class={item.selected ? 'active' : ''}>
{item.name}
</li>
)}
</For>
</ul>
4. Two-way Data Binding
Classic:
<input ng-model="user.email" />
<p>{{ user.email }}</p>
Lightweight:
<input
value={email()}
onInput={(e) => setEmail(e.target.value)}
/>
<p>{email()}</p>
// JS tab
const [email, setEmail] = createSignal('');
5. Event Handlers
Classic:
<button ng-click="handleClick($event, item)">Click</button>
<form ng-submit="submitForm()"></form>
Lightweight:
<button onClick={(e) => handleClick(e, item)}>Click</button>
<form onSubmit={submitForm}></form>
6. Class and Style Bindings
Classic:
<div ng-class="{ active: isActive, disabled: isDisabled }"></div>
<div ng-style="{ color: textColor, 'font-size': fontSize }"></div>
Lightweight:
<div classList={{ active: isActive(), disabled: isDisabled() }}></div>
<div style={{ color: textColor(), fontSize: fontSize() }}></div>
7. Form Elements
Classic:
<select ng-model="selectedItem"
ng-options="item.name for item in items">
</select>
<input type="checkbox" ng-model="isChecked" />
Lightweight:
<select value={selectedItem()}
onChange={(e) => setSelectedItem(e.target.value)}>
<For each={items}>
{(item) => <option value={item.value}>{item.name}</option>}
</For>
</select>
<input
type="checkbox"
checked={isChecked()}
onChange={(e) => setIsChecked(e.target.checked)}
/>
8. ng-switch Equivalent
Classic:
<div ng-switch="user.role">
<div ng-switch-when="admin">Admin Panel</div>
<div ng-switch-when="user">User Panel</div>
<div ng-switch-default>Guest Panel</div>
</div>
Lightweight:
<Switch>
<Match when={user().role === 'admin'}>
<div>Admin Panel</div>
</Match>
<Match when={user().role === 'user'}>
<div>User Panel</div>
</Match>
<Match when={true}>
<div>Guest Panel</div>
</Match>
</Switch>
9. ng-init Equivalent
Classic:
<div ng-init="count = 0"></div>
Lightweight:
// JS tab
const [count, setCount] = createSignal(0);
10. ng-bind Equivalent
Classic:
<span ng-bind="title"></span>
<span ng-bind-html="htmlContent"></span>
Lightweight:
<span>{title()}</span>
<span innerHTML={htmlContent()} />