Un modo generico per gestire un legame bidirezionale tra un oggetto Ember e le caselle di controllo può essere implementato utilizzando Ember.js semplice senza la necessità di alcun plug-in se si desidera sincronizzare l'enumerazione sul server e sul client manualmente (usando AJAX o WebSockets). Nota che Ember può aggiornare l'elenco delle opzioni con Checkbox automaticamente dopo una sincronizzazione.
Quindi d'ora in poi, mi si supponga di avere am enum con ruoli come un array Ember:
App.Roles = [ "USER", "ADMIN", "GUEST" ];
Poi ci mostrerà le opzioni disponibili per l'utente in un CollectionView come questo (il modello è riportata qui sotto).
OptionsView = Em.CollectionView.extend({
contentBinding: 'App.Roles', // Show a list of _all_ available roles
userBinding: 'App.User', // This points to the active user
tagName: 'ul', // Shown as a <ul>
itemViewClass: Em.View.extend({
userBinding: 'parentView.user', // For convenience
templateName: 'user-roles' // Defined later
})
});
Il modello per ogni opzione è:
<script data-template-name="user-roles" type="text/x-handlebars">
<label> {{view App.RoleCheckbox
contentBinding="view.content"}}
{{view.content}}
</label>
</script>
Nota che l'uso di tag <label>
fa in modo che l'evento del Casella click
è sparato sulla cliccando in qualsiasi punto del tag.
Infine il App.RoleCheckbox
è un'estensione della classe Ember.Checkbox
che gestisce la checked
proprietà e click
evento per alternare il ruolo:
App.RoleCheckbox = Em.Checkbox.extend({
userRolesBinding: 'parentView.user.roles', // Points to the roles of the user
checked: function() {
var userRoles = this.get('userRoles');
return userRoles.contains(this.get('content'));
}.property('content', '[email protected]'),
click: function (evt) {
var isPresent = this.get('checked'),
userRoles = this.get('userRoles'),
role = this.get('content');
if (!isPresent) {
userRoles.pushObject(role);
} else {
userRoles.removeObject(role);
}
}
});
Un esempio di lavoro di questo è: http://jsfiddle.net/BLQBf/ (Guarda la console per vedere la messaggi di registro)
Si noti che questo non è completamente Ember-esque, dal momento che la vista sta facendo parte del lavoro previsto per il controller
. Idealmente, l'evento click
chiamerebbe una funzione su RoleCheckboxController
che apporterebbe modifiche all'oggetto User
.
grazie @musically_ut per la risposta. Ho dovuto posticipare la mia implementazione di questo, quindi il mio commento arriva tardi.La tua soluzione funziona, ma c'era un piccolo problema. L'osservatore su "checked" si innesca prima dell'evento click. Lì ho dovuto ripristinare l'istruzione if-else attivata dall'evento click. –
@musically_ut, ho posto una domanda su come effettuare la chiamata al RoleCheckboxController come suggerito [qui] (http://stackoverflow.com/questions/16281401/ember-how-to-create-and-bind-a- checkbox-controller), ma non ho potuto farlo funzionare. – lauhub
ha già attivato una modifica sulla risposta di @musical_ut. Attualmente è sottoposto a revisione paritetica. Fino a quando non viene revisionato. si prega di utilizzare l'evento "change" invece dell'evento "click" a causa della compatibilità del browser. Vedi anche https://github.com/emberjs/ember.js/issues/2604 –