Javascript Backbone.js源代码通读
我正在阅读Backbone.js源代码,对这些行(L230-238,v0.5.3)有些困惑 我疯了吗,还是最后一行对具有单个未定义属性的哈希对象运行验证 似乎验证是在模型对象的实例上运行的,该实例的属性将被取消设置Javascript Backbone.js源代码通读,javascript,backbone.js,Javascript,Backbone.js,我正在阅读Backbone.js源代码,对这些行(L230-238,v0.5.3)有些困惑 我疯了吗,还是最后一行对具有单个未定义属性的哈希对象运行验证 似乎验证是在模型对象的实例上运行的,该实例的属性将被取消设置 您对其功能的评估是正确的,但这是预期的功能 调用unset时,一次只能告诉它取消设置一个属性:model.unset(“myAttr”) 取消设置时,将调用验证以确保模型处于有效状态。如果设置为未定义的属性将导致模型无效,则未设置将失败。如果未定义属性有效,则该属性将从模型中删除 它
您对其功能的评估是正确的,但这是预期的功能 调用unset时,一次只能告诉它取消设置一个属性:
model.unset(“myAttr”)
取消设置时,将调用验证以确保模型处于有效状态。如果设置为未定义的属性将导致模型无效,则未设置将失败。如果未定义属性有效,则该属性将从模型中删除
它传递“具有单个未定义属性的哈希对象”的原因是javascript中的所有对象都是“哈希对象”——键值对或关联数组。无论如何获取对象,它都是一个关联数组
在第236-237行中创建了一个具有一个空属性的对象,该属性以正在取消设置的模型属性命名。这是为了在传递给validate方法的对象上蒙混过关不会改变模型本身的状态
希望这有助于解释问题。确实有帮助,但我看不出如何在第236-237行中添加模型属性的副本。
void 0
是否比返回未定义的做得更多?我可以看到正在检查的对象是this
,它作为this
传递给\u performValidation
。如果我知道.validation(attrs)方法来自\u performValidation
oops中的第397行,也许我会更容易理解!你说得对。。。这只是一个未定义的问题。我犯了个错误。修正了我的答案。validate(attrs)
方法是您在模型中编写的方法。如果你不提供它,它就不会被调用。如果您确实提供了它,它将被调用:MyModel=Backbone.Model.extend({validate:function(attrs){…})代码>啊,好吧,这是有道理的。因此,这取决于MyModel.validate(attr)
方法来获取attr
——一个具有未定义值的对象哈希,并检查该键/值对是否会使此
无效?对-它使用“已更改”(在本例中已删除)的属性运行validate
方法,因此,您可以验证模型是否正确。参见文档中的示例好的,这现在是有意义的。我可以看到validate如何与unset
一起工作,以进行类似attr.key1!=无效的\u值
。它看起来像是一些验证,例如(attr.key1+attr.key2).length!=2
会在他们不应该通过的时候通过——尽管这是一个令人费解的案例(除非我又错过了什么)。
unset : function(attr, options) {
if (!(attr in this.attributes)) return this;
options || (options = {});
var value = this.attributes[attr]; // ?: value appears to be unused (?)
// Run validation.
var validObj = {};
validObj[attr] = void 0; //void 0 is equivalent to undefined
if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;