2012-04-25 1 views
7

Il mio modello di backbone ha un valore booleano (isRegistered). Quando visualizzo la vista, voglio che la casella sia spuntata o deselezionata a seconda del valore vero/falso del booleano.Backbone.js - Qual è il modo migliore per selezionare una casella di controllo

Il mio sforzo attuale si presenta così:

<input id="isRegisteredCheckbox" checked="<%= isRegistered ? 'checked': ''"/> 

questo non funziona perché secondo il W3C specifica l'attributo controllato deve essere completamente rimosso per deselezionare la casella di controllo.

Come si utilizza il modello di dorsale?

+0

value = "<% = item.id%>" /> –

risposta

7

Non è necessaria la parte checked=. basta stampare check-in il tag se ha bisogno di essere controllato.


EDIT

Ora che abbiamo stabilito che solo la stampa "controllato" fuori è valido html, si potrebbe provare per semplicità:

render:

var registered; 
var tmpl = _.template(your template); 
isRegistered ? registered = 'checked' : registered = ''; 
var tmpl_data = _.extend(this.model.toJSON(), {registered: registered}); // or whatever values you need to add 
$(this.el).html(tmpl(tmpl_data)); 

modello :

<input type="checkbox" {{ registered }}> 

Non è necessario disporre di condizionali disordinati nel modello utilizzando questo metodo.

+0

Mentre il tuo suggerimento verrà visualizzato nei browser, l'OP ha menzionato "W3C specs". A seconda di quale specifica si riferisca all'attributo selezionato potrebbe essere necessario un valore corrispondente (anche se il suo ""). – EBarr

+0

@EBarr è valido in HTML 4 Strict, HTML 4 Transitional e HTML5. Voglio dire, suppongo che sia possibile che non sia valido in HTML4, ma, se HTML4 rigoroso e di transizione, e HTML 5 non sono "specifiche W3C", non sono sicuro di ciò che costituirebbe le specifiche W3C. – tkone

+0

, fai in modo che "non valido in html 3" ... o, gulp, xhtml ... – tkone

7

si potrebbe usare un test per racchiudere checked='checked'

<input id="isRegisteredCheckbox" <% if (isRegistered) { %>checked="checked"<% } %> /> 
1

Ho usato per usare un Decorator per questi casi. Espongo qui un esempio di come si può assomiglia:

// code simplified and not tested 
var MyModelDecorator = Backbone.Model.extend({ 
    initialize: function(opts){ 
    this.model = opts.model; 
    }, 

    toJSON: function(){ 
    var json = 
     _.extend(
     this.model.toJSON(), 
     { 
      checked: this.checked(), 
      css_classes: this.cssClasses() 
     } 
    ); 

    return json; 
    }, 

    checked: function(){ 
    result = ""; 
    if(this.model.get("checked")) result += "checked=\"true\""; 
    return result; 
    }, 

    cssClasses: function(){ 
    result = ""; 
    if(this.model.get("checked"))   result += " checked"; 
    if(this.model.get("key") == "value") result += " important"; 
    return result; 
    } 
}); 

Ho aggiunto un extra css_classesattributo decoratore modo da poter vedere questo approccio può essere una soluzione comune per diverse situazioni.

tuo View.render può assomigliare a questo:

// code simplified and not tested 
var myView = Backbone.View.extend({ 
    template: _.template("<input id=\"isRegisteredCheckbox\" <%= checked %> class=\"<%= css_classes %>\" />"), 

    render: function(){ 
    var decorator = new MyModelDecorator({ model: this.model }); 
    this.$el.html(this.template(decorator.toJSON())); 
    } 
}); 
0

Ho avuto un problema simile in cui ho ereditato di qualcuno Django + hamlpy (HAML) + Backbone.js + Undescore.js con i modelli Moustache (che casino!)

elaborazione Haml in hamlpy non piaceva esattamente:

%input{ :checked => {{isChecked}} ? true : None } 

O qualsiasi cosa simile. Ho ottenuto uno stacktrace Django hamlpy.

sono riuscito a incidere utilizzando sezioni invertite di Moustache (vedi: http://mustache.github.com/mustache.5.html)

{#isChecked} 
%input{:checked => 'true' } 
{/isChecked} 
{^isChecked} 
%input{ ... without the checked attribute ... } 
{/isChecked} 

In ogni caso, la speranza che aiuta a qualche povero Googler di sprecare ore della loro forza vitale!

1

Ecco un modo molto semplice per farlo.

<input <% if(isRegistered) print("CHECKED"); %> type="checkbox" id="isRegisteredCheckbox" /> 

Si noti che io uso <% e non <% = per la condizione.

Si può solo impostare il valore di isRegistered a "selezionata" o "" nel modello e chiamare

<input id="isRegisteredCheckbox" <%= registered %> /> 

con qualcosa di simile

serialize: function() { 
    var isChecked = (isRegistered) ? "CHECKED" : ""; 
    return {registered : ischecked}; 
},