我正在尝试重置模型的changedAttributes()上的值。这是我的具体案例:
我从服务器上获取一个测验模型,该模型下载测验,问题和问题答案。在获取测验时,我会解析测验的属性,并在从服务器返回的JSON上出现问题时生成问题。为了解析这些问题,我创建了一个Question模型,然后调用一个名为fromJSON的实例方法,传递包含问题属性的对象。此方法在传递从服务器接收的对象的模型上调用@parse然后调用@set。您可以将fromJSON方法视为填充对象的属性。
我遇到的问题是现在我想在Question模型上使用hasChanged()方法,但这总是返回true
,因为fromJSON方法使用@set()。我需要一种方法来“重置”已经改变的属性,所以一旦我完成了fromJSON方法,我可以告诉模型,'嘿,这是来自服务器的最新模型状态'所以从现在开始跟踪任何变化并放弃过去的任何变化。另一种方法是能够在模型上设置属性而不更改已更改的内部值(在调用changedAttributes()和hasChanged()时使用。)
代码:
# Quiz model
class Quiz extends Backbone.Model
parse: (response, options) ->
attributes = response
if attributes.questions
attributes.questions = @createQuestions( response.questions )
return attributes
createQuestions: ( questions_json ) =>
questions = new QuestionsCollection()
# Parse every question
for question_json in questions_json
question = new Question()
if question_json
question.fromJSON( question_json )
return questions
# Question model
class Question extends Backbone.Model
# Get the model json and parse it and set its attributes
fromJSON: (json , options ) =>
return @set( @parse( json , options ) , { silent : true } )
答案 0 :(得分:1)
如果您确定自己在做什么,可以修改模型内部值。
使用attributes
哈希。例如:
# Get the model json and parse it and set its attributes
fromJSON: (json , options ) =>
values= @parse json, options
for attr, val of @parse json, options
@validate
@attributes[attr] = value
它几乎不是set
正在做的事情,没有与旧值进行比较,触发更改事件,并将旧值存储在previousAttributes
中。
但请记住:您必须使用Backbone内部版本,这可能会在未来版本中发生变化。