【问题标题】:is this a bug of backbonejs set function这是backbonejs设置功能的错误吗
【发布时间】:2013-03-28 21:13:16
【问题描述】:

您好,我是新来的backbonejs,

我在尝试http://addyosmani.github.com/backbone-fundamentals/#validation 的示例时遇到了问题

我创建了两个模型对象,myTodo 和 myTodo1,

如果我这样调用 set 函数,由于验证错误,它会返回 completed:false

var myTodo = new Todo(); myTodo.set('完成', true, {validate: true}); console.log("完成:"+myTodo.get('完成')); /* 上面的代码返回以下日志: 该模型已初始化。 记得为你的待办事项设置一个标题。 完成:假 */

购买为什么在执行以下代码时不执行验证

var myTodo1 = new Todo(); myTodo1.set('完成',true); console.log("完成:"+myTodo1.get('完成')); myTodo1.set({validate:true}) console.log("完成:"+myTodo1.get('完成')); /* 上面的代码返回以下日志: 该模型已初始化。下划线-test2.js:11 完成:真正的下划线-test2.js:28 完成:真 */

虽然两组代码做同样的工作,但在第一种情况下执行验证,但在第二种情况下不执行

为什么?????

下面是完整的示例代码。

var Todo = Backbone.Model.extend({ 默认值:{ 完成:假, }, 验证:函数(属性){ 如果(attribs.title === 未定义){ return "记得为你的待办事项设置一个标题。"; } }, 初始化:函数(){ console.log('此模型已初始化。'); this.on(“无效”,函数(模型,错误){ 控制台日志(错误); }); this.on('change:title', function(){ console.log('- 标题的值已经改变。'); }); } }); **var myTodo = new Todo(); myTodo.set('完成', true, {validate: true}); console.log("完成:"+myTodo.get('完成'));** **var myTodo1 = new Todo(); myTodo1.set('完成',true); console.log("完成:"+myTodo1.get('完成')); myTodo1.set({validate:true}) console.log("完成:"+myTodo1.get('完成'));**

【问题讨论】:

  • myTodo1.set({validate:true}) 正在将名为 validate 的属性设置为 true。在您的代码中尝试myTodo1.set({validate:'hello!'}); console.log(myTodo1.get('validate'));,您会发现这与运行您的验证函数无关。

标签: javascript backbone.js


【解决方案1】:

它们完全不同。

myTodo1.set({validate:true})

这里您没有运行验证。您只是将模型的属性“验证”设置为 true。所以基本上,在第二个示例中,您设置了 2 个属性而不进行验证。

在任何情况下,您都不能希望在之后进行验证,因为您的属性已经设置好了。

编辑:
我不知道在为 validate 属性设置新值时的行为。但是您肯定会用布尔值覆盖您的验证功能。这肯定会导致意想不到的行为。

编辑 2:

好吧,我想这将是我最后一次尝试了。

myTodo1.set({completed:true});
myTodo1.set({validate:true});

也相当于:

myTodo1.set({completed: true}).set({validate: true});

但在任何情况下都不等同于:

myTodo1.set({completed: true}, {validate: true});

在最新版本中,{validate: true} 告诉 Backbone 在模型上应用验证功能。

在前者中,您只需将 completed 属性设置为 true 而不告诉模型进行验证然后您将 validate 属性设置为 true 再次没有告诉模型进行验证。所以基本上你永远不会告诉模型去验证

【讨论】:

  • 我也想知道如何回复你的回复,它没有格式化
  • 嗨@Loamhoof,在backbonejs中这行代码
    myTodo.set('completed', true, {validate: true});
    和这行代码做同样的工作,
    myTodo.set({completed:true}, {validate: true});我想知道我是否两次在第二个对象上调用 set 函数,为什么这项工作没有完成。 myTodo1.set({completed:true}); myTodo1.set({validate:true})
  • 我同意你的观点,你在评论中写的两段代码是相同的。但是myTodo1.set({completed:true}); myTodo1.set({validate:true})myTodo.set({completed:true}, {validate: true});完全不同...这里只是将completed属性设置为true,然后将validate属性设置为true...
  • No in this line myTodo.set({completed:true}, {validate: true}) 验证被执行,如果是这样,那么它也应该使用以下代码执行 myTodo1.set({completed :真的}); myTodo1.set({validate:true})
猜你喜欢
  • 2010-12-04
  • 2013-05-08
  • 2012-08-25
  • 2021-02-08
  • 2015-01-20
  • 2021-08-29
  • 1970-01-01
  • 2017-04-19
  • 2013-06-11
相关资源
最近更新 更多