2012-03-14 54 views
1

我試圖創建一個使用一個骨幹型號:如何創建可能在創建時無效的主幹模型?

var newUser = new App.User({ 
    name: $('input[name=new_user_name]').val(), 
    email: $('input[name=new_user_email]').val() 
    }); 

與以下驗證:

App.User = Backbone.Model.extend({ 

    validate: function(attrs) { 
    errors = []; 
    if (_.isEmpty(attrs.name)) { 
     errors.push("Name can't be blank"); 
    } 
    if (_.isEmpty(attrs.email)) { 
     errors.push("Email can't be blank"); 
    } 

    return _.any(errors) ? errors : null; 
    }, 
... 
}); 

然而,當文本框的值是空的,該模型不能因爲創建驗證失敗。

有沒有一種方法來創建模型和運行isValid()檢查值是否正確?還是有其他一些方法可以在模型創建之前運行驗證?

backbone model creation code看來,如果驗證失敗,它會拋出異常Error("Can't create an invalid model"),但是有可能在手之前檢查驗證嗎?

+0

我是新來的骨幹,但在我看來像它被傳遞選項'無聲:TRUE'到'set'方法,與設定方法傳遞該選項來驗證,和一個truthy無聲屬性繞過驗證:http://documentcloud.github.com/backbone/docs/ backbone.html#部分-55 – Shad 2012-03-14 21:51:23

+0

我相信{沉默:真正}僅適用於抑制由改變模型觸發的事件。所以如果我model.set({name:'orange'},{silent:true});它將阻止模型更改事件觸發,因此,將對此模型的更改事件作​​出反應的任何偵聽器都不會執行。如果您有一個視圖綁定到模型更改並相應地反映更改,這很方便。例如。 model.bind(「變」,this.onChange,這一點) – jmk2142 2012-03-15 02:43:11

回答

1

我的理解是,你要創建一個用戶模型,該模型得到基於某種形式的輸入屬性填充。

你有它設置現在,對我來說似乎不是很骨幹-Y的方式。

var newUser = new App.User({ 
    name: $('input[name=new_user_name]').val(), 
    email: $('input[name=new_user_email]').val() 
}); 

對我來說,感覺就像你混在一起的東西,發生在你的模型,它應該表現對象的意見。我可能會先創建一個空白的基本模型,然後查看致意這個模型並通過模型。

User = Backbone.Model.extend ({ 
    defaults: { 
     name: undefined, 
     email: undefined 
    } 
)}; 

UserView = Backbone.View.extend ({ 
    events: { 
     // like click on submit link, etc. 
     'click #submitButton': 'onSubmit' 
    }, 
    initialize: function() { 
     this.user = this.model; 
    }, 
    onSubmit: function() { 
     // run some validation on form inputs, ex. look for blanks, then... 
     if (/* validation passes */) { 
      var nameEntered = $('input[name=new_user_name]').val(); 
      var emailEntered = $('input[name=new_user_email]').val(); 
      this.user.set({name:nameEntered, email:nameEntered}); 
     } 
    } 
}); 

// Do it! 
var newUser = new User(); 
var newUserView = new UserView({model:newUser}); 

一個偉大的方式來驗證表單輸入,而不是比模型屬性是使用jquerytools驗證。它適用於HTML5屬性,例如pattern = regex和type = email,使其變得非常容易。

+0

+1爲一個偉大的答案 – rjz 2012-03-15 02:04:32

+0

我做的做同樣的事情,在我的模型視圖中的聲明,但我想我想用我的驗證中的骨幹機型在我的骨幹觀以及也就是說,在這裏你有「/ *驗證通過* /」 – zlog 2012-03-15 10:02:33

1

不能創建骨幹無效的模型。

如果要創建一個模型,將值傳遞給構造函數沒有驗證將完成。

如果您是通過獲取然後無效數據將導致模型驗證模型加入到集合失敗,模型不會被添加到集合中。這應該會觸發error事件,所以如果您的服務器提供無效數據,您應該正在監聽它。

如果你想使一個模型,但要確保數據是有效的,你必須:

var mymodel = new MyModel(); 
mymodel.set(attrs); 

即使嘗試模型instantation骨幹期間通過{silent: false}將覆蓋它,因爲它不會讓你創建一個無效的模型,不會拋出錯誤。 (我們這裏的arent討論)

您可以通過查看源代碼看到這一點,也看看這個github ticket

+0

也不是我的答案的一部分,但我已經寫了骨幹模型驗證混入。 http://github.com/toddself/Backbone.Validator在模型驗證會如何派上用場 – tkone 2012-03-15 02:06:20

+0

好一點。在這個問題中,服務器端和提取概念沒有明確提到,但我認爲這個答案顯示了完整的基於骨幹的項目的另一端。我認爲模型驗證與輸入驗證的想法是重要的。 – jmk2142 2012-03-15 02:17:20

+1

問題的細節進入服務器方面,但主體直接被這個回答。人們會來這裏尋找這個基本問題的答案。另外,您可以使用模型驗證通過偵聽errr消息來提供輸入驗證。稍微轉一下但可能。 – tkone 2012-03-15 03:33:32

3

您可以創建unvalid模型silent: true,但以這種方式收集不`噸特羅事件「加'。但是你可以發送默認選項的功能添加和趕上的validate()這個選項

collection.add({option:'unvalid_value'}, {validation: false}); 
Model = Backbone.Model.extend({ 
    validate: function(attributes, options){ 
    if (options.validation === false) 
     return; 
    //Validation code 
    //.....  
    } 
}); 

這樣你就可以用無效哈希模型)