Sto usando angular 1.5 e volevo estrarre parte del mio DOM in un component.
Ecco quello che ho fatto finora:
angular.module('my-app').component("menuItem",{
templateUrl : "lib/menu-item.tmpl.html",
bindings : {
index : "<",
first : "<",
last : "<",
item : "=",
onDelete : "&",
onMoveUp : "&",
onMoveDown : "&"
},
controller : function($scope) {
}
});
E il modello si presenta in questo modo:
<div>
<aside class="sort-buttons">
<ul>
<li>
<button ng-click="$ctrl.onMoveUp({index : $ctrl.index})"
ng-disabled="$ctrl.first">
<i class="icon icon-up"></i>
</button>
</li>
<li>
<button ng-click="$ctrl.onMoveDown({index : $ctrl.index})"
ng-disabled="$ctrl.last">
<i class="icon icon-down"></i>
</button>
</li>
</ul>
</aside>
<div class="row">
<button class="btn btn-danger btn-icon btn-remove"
ng-click="$ctrl.onDelete({index : $ctrl.index})">
<i class="icon icon-remove"></i>
</button>
</div>
</div>
Io uso questa componente (! Lungi dall'essere compiuto) in questo modo:
<section class="container menu">
<menu-item index="$index" first="$first" last="$last" item="item"
on-delete="removeItem(index)"
on-move-up="moveItemUp(index)"
on-move-down="moveItemDown(index)"
ng-repeat="item in menu">
</menu-item>
<!-- some other display details of `$ctrl.item` -->
</section>
Ho tre domande principali:
- Perché devo usare
$ctrl
ovunque nel mio modello? C'è$scope
quindi perché tutti i binding vanno a$ctrl
anziché a$scope
? E c'è un modo per cambiare questo? - Posso passare in qualche modo valori come
$index
,$first
e$last
? Mi sembra che sia un "burro da burro" per passarli in ... - È questo l'approccio giusto? O dovrei usare direttiva? So che i componenti hanno un ambito isolato e le direttive possono avere un ambito non isolato. ma potrei mescolare/abbinare in una direttiva (condividere l'ambito con il controller, ma aggiungere anche le mie funzioni da utilizzare solo all'interno di direttiva/modello?)
Grazie per il vostro aiuto.
Un commento sarebbe bello se si votasse? –