在Backbone模型上重置hasChanged()和changedattributes()

时间:2014-03-04 00:28:41

标签: backbone.js coffeescript

我正在尝试重置模型的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 } )

1 个答案:

答案 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内部版本,这可能会在未来版本中发生变化。