2012-07-26 87 views
0

我有以下的模型和集合:Backbone.js的:Collection.Get(ID) - >忽略大小写

var UserModel = Backbone.Model.extend({ 
    url: 'api/user', 
    idAttribute:'username', 
    defaults: { 
     username:'', 
     password:'', 
     email:'', 
     tags:'' 
    } 
}); 
var UserCollection= Backbone.Collection.extend({ 
    url: 'api/user', 
    model: UserModel 
}); 

当我使用检索收集用户:

var myUser = collection.get(username); 

的用户名必须是正确的,否则我只会得到空值。

有没有办法告诉骨干忽略这种情况下的某些操作呢?

回答

1

当然,你只需要改变相关的代码。它是在线路的backbone.js240-242(用于记录0.9.2版本):

get: function(attr) { 
    return this.attributes[attr]; 
}, 

更改它像到:

get: function(attr) { 
    // will skip if null or undefined -- http://stackoverflow.com/questions/5113374/javascript-check-if-variable-exists-which-method-is-better 
    if (this.attributes[attr] != null) { 
     return this.attributes[attr]; 
    } 
    // and then try to return for capitalized version -- http://stackoverflow.com/questions/1026069/capitalize-the-first-letter-of-string-in-javascript 
    else {   
     return this.attributes[attr.charAt(0).toUpperCase() + attr.slice(1)]; 
    } 
}, 

收集改变

get: function(id) { 
    if (id == null) return void 0; 
    return this._byId[id.id != null ? id.id : id]; 
}, 

到这样的事情可能工作:

get: function(id) { 
    if (id == null) return void 0; 
    var firstCase = this._byId[id.id != null ? id.id : id]; 
    if (firstCase != null) { 
     return firstCase; 
    } 
    else { 
     return this._byId[capitalize(id.id) != null ? capitalize(id.id) : capitalize(id)]; 
    } 
}, 
+0

很酷。谢谢我完全忘记了重写标准行为是多么容易。 – AyKarsi 2012-07-26 08:11:58

+2

更好的方法是使用'Backbone.Model.extend({})'并覆盖那里的'get'。您可以代理'Backbone.Model.prototype.get.call(this,lowercaseId)'并确保正确的行为。 – 2013-12-05 15:01:22