backbone.js直接设置模型内部属性哈希
使用Backbone.js我知道强烈建议使用该方法设置模型的属性,而不是直接修改 但是,除了不自动触发“更改”事件外,直接修改内部哈希还有哪些缺点或“副作用” 我面临的问题是,虽然set方法采用对象文字,但我需要使用在运行时确定的变量来分配左侧。谢谢backbone.js直接设置模型内部属性哈希,backbone.js,Backbone.js,使用Backbone.js我知道强烈建议使用该方法设置模型的属性,而不是直接修改 但是,除了不自动触发“更改”事件外,直接修改内部哈希还有哪些缺点或“副作用” 我面临的问题是,虽然set方法采用对象文字,但我需要使用在运行时确定的变量来分配左侧。谢谢 myModel.set({ myProperty:myValue;//myProperty是一个变量,因此这是无效语法 }) //vs myModel.attributes[myProperty]=myValue//myProperty是一个可以计
myModel.set({
myProperty:myValue;//myProperty是一个变量,因此这是无效语法
})
//vs
myModel.attributes[myProperty]=myValue//myProperty是一个可以计算的变量
好吧,如果你看一下,你会发现set
做了很多事情
如果您扩展了主干网,则会发生什么情况?该模型具有为您实现此功能的功能:
Backbone.Model.prototype.setByName = function(key, value, options) {
var setter = {};
setter[key] = value;
this.set(setter, options);
};
然后,您可以直接在模型上执行所需操作:
var model = new Backbone.Model();
model.setByName(myProperty, "bar");
这对我来说是个更好的解决办法
编辑
正如@earl3s所指出的,在主干网的最新版本中不再需要这样做。今天,您只需调用model.set(myProperty,“bar”)
,它就可以完成您想要的功能。在Brian Genisio提到的中,您可以阅读以下几行:
处理“key”、value和{key:value}样式的参数。
所以您可以只使用model.set(myProperty,“bar”,options)。
也许他们在Brian Genisio的帖子之后添加了这个功能。。我不知道。我认为你的解决方案很好。此功能应合并到较新的主干版本中!还感谢您指出带注释的源代码;你说得对,我一开始就应该看一看。太好了!这段代码我已经写了十几遍了,从来没有想过要把它变成一种方法。:)顺便说一句:没有必要为此使用扩展
Backbone.Model.prototype.setByName=函数(…){…}
执行相同的操作。。。功能相同。只是一种不同的方式而已。@Derick Bailey:有趣。。。我认为.extend
在扩展原型方面有一些额外的智能。。。不。它实际上是用于扩展任何具有更改集合的对象。没什么疯狂的。改变我的回答,承认这一点。谢谢。此功能已内置在集合
方法中。为什么再加一次?您可以编写model.set(stringProp,value)
或model.set({prop:value})
@earl3s好吧,如果您不知道prop
的名称(即prop是一个变量),那么第二种方法就不起作用了。IIRC,两年前(~0.5.0),当我写这篇文章时,你只能用对象文本设置(你的第一个机制不可用),所以这是唯一的方法。我将更新我的答案。这是正确的解决方案。set
方法上已存在该功能。