2012-04-25 93 views
7

我的骨幹模型有一個布爾值(isRegistered)。當我渲染視圖時,我想根據布爾值的真/假值選中或取消選中複選框。Backbone.js - 檢查複選框的最佳方法是什麼

我現在的工作是這樣的:

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

這不起作用,因爲根據W3C規範checked屬性需要完全去除,以取消選中的複選框。

我該如何使用骨幹模板做到這一點?

+0

value =「<%= item.id%>」/> – 2015-04-13 19:18:16

回答

7

你不需要checked=部分。只需在標籤中打印出需要檢查的標籤即可。


編輯

現在,我們已經確定,只是打印 「選中」 了是有效的HTML,你可以嘗試簡單:

渲染:

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)); 

模板:

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

使用此方法無需在模板中使用混亂的條件。

+0

雖然您的建議將在瀏覽器中呈現,但OP提到了'W3C規範'。取決於他所指的檢查屬性可能需要相應的值(即使是「」)。 – EBarr 2012-04-25 12:25:13

+0

@EBarr它在HTML 4嚴格,HTML 4過渡和HTML5中有效。我的意思是我猜這有可能在HTML4中無效,但是,如果HTML4嚴格&過渡,並且HTML 5不是「W3C規範」,我不確定什麼構成W3C規範。 – tkone 2012-04-25 12:39:21

+0

呃,讓「html 3中無效」......或者,gulp,xhtml ...... – tkone 2012-04-25 12:46:50

7

你可以使用一個測試附上checked='checked'

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

我用一個Decorator這個案件。我在這裏暴露的它如何看起來像一個例子:

// 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; 
    } 
}); 

我增加了一個額外的css_classes裝飾屬性所以你可以看到這種方法可以是幾種情況的常見解決方案。

View.render可以是這樣的:

// 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

我有,我繼承別人的Django的+ hamlpy(HAML)+ Backbone.js的+ Undescore.js與鬍鬚模板類似的問題(什麼亂七八糟的!)在hamlpy

Haml的處理並不完全一樣:

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

或任何類似的事情。我有一個Django hamlpy stacktrace。

我設法用鬍子的反向的段砍(請參閱:http://mustache.github.com/mustache.5.html

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

不管怎樣,希望幫助一些貧困的Google用戶浪費自己的生命的力量小時!

1

這是一個非常簡單的方法。

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

注意,我使用<%且不<(%)=爲條件。

你可以只設置isRegistered的值設置爲 「在你的模型,並呼籲

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

的東西,如

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