2017-04-10 48 views
0

我在我的Backbone模型中有一個作用域問題。我正在嘗試引用Backbone.Validation對象中的模型函數。主幹模型作用域問題與骨幹驗證自定義功能

也就是說,我不能從validation對象/圖中訪問模型功能validateDob

Backbone.Model.extend({ 

    validation: { 
     firstname: { required: true, msg: _('First Name is required').translate() } 
    , dobday: this.validateDob // this. refers to the immediate object {} 
    , dobmonth: validateDob  // undefined function 
    , dobyear: this.validateDob // How can I access the function validateDob? 
    } 

, validateDob: function(value) { 
     var selDay = $('select[name="dobday"] option:selected').val(); 
     var selMonth = $('select[name="dobmonth"] option:selected').val(); 
     var selYear = $('select[name="dobyear"] option:selected').val(); 

     if (!Utils.isAdult(selDay, selMonth, selYear)) 
      return _('You have to be at least 18 years old.').translate(); 
    } 
}); 

任何意見,我該怎麼設置呢?

+0

如何調用此方法?嘗試像例子'dobday:this.validateDob()' –

+1

您使用哪個驗證插件? –

回答

0

你可以試試這個

Backbone.Model.extend({ 
    validation: { 
     firstname: { required: true, msg: _('First Name is required').translate() } 
    }, 
    initialize:function() { 
     this.validation.dobyear= this.validateDob; 
     //you can other props similarly 
    }, 
    validateDob: function(value) { 
     var selDay = $('select[name="dobday"] option:selected').val(); 
     var selMonth = $('select[name="dobmonth"] option:selected').val(); 
     var selYear = $('select[name="dobyear"] option:selected').val(); 

     if (!Utils.isAdult(selDay, selMonth, selYear)) 
      return _('You have to be at least 18 years old.').translate(); 
    } 
}); 
1

看你的代碼,validateDob不需要訪問實例,因此,你可以讓一個名爲功能如下:

function validateDob(value) { 
    var selDay = $('select[name="dobday"] option:selected').val(); 
    var selMonth = $('select[name="dobmonth"] option:selected').val(); 
    var selYear = $('select[name="dobyear"] option:selected').val(); 

    if (!Utils.isAdult(selDay, selMonth, selYear)) 
    return _('You have to be at least 18 years old.').translate(); 
} 

Backbone.Model.extend({ 
    validation: { 
    firstname: { 
     required: true, 
     msg: _('First Name is required').translate() 
    }, 
    dobday: validateDob, 
    dobmonth: validateDob, 
    dobyear: validateDob 
    }, 
    validateDob: validateDob 
}); 

但是,使用全局選擇器直接從DOM訪問值不是推薦的做法。您應該使用選擇器將這些值設置爲模態屬性,其範圍是查看元素。

在這種情況下,假設你使用backbone.validation插件,您可以定義返回驗證配置類似的功能:

Backbone.Model.extend({ 
    validation: function() { 
    return { 
     firstname: { 
     required: true, 
     msg: _('First Name is required').translate() 
     }, 
     dobday: this.validateDob, // this should be modal instance now 
     dobmonth: this.validateDob, 
     dobyear: this.validateDob 
    } 
    }, 
    validateDob: function(value) { 
    // Now context should be the modal instance so you can do this.get('prop') 
    var selDay = $('select[name="dobday"] option:selected').val(); 
    var selMonth = $('select[name="dobmonth"] option:selected').val(); 
    var selYear = $('select[name="dobyear"] option:selected').val(); 

    if (!Utils.isAdult(selDay, selMonth, selYear)) 
     return _('You have to be at least 18 years old.').translate(); 
    } 
});