2011-11-20 65 views
2

这可能是组件滥用的结果,尽管我不这么认为。 我有一个问题,视图更新Backbone JS中的模型,并调用模型的Set方法,以便验证它的输入。 从理论上讲,这样的行为有两个结果:错误和变化。 这两个事件按照规定工作。 但事实上还有第三个事件:没有变化。 也就是说,如果输入完全没有改变,在调用Set之后我无法判断,因为不会发生错误,但也不会发生更改事件,因为实际上没有发生任何改变 - 但我仍然想知道这样的案件。 有没有办法让我这样做?如何判断Backbone.js中的模型是否未更改?

原因是只有在没有错误发生时才会执行某个操作,但是我无法知道(如果没有更改事件)模型试图设置新值并且以无因为这一切都是异步发生的。

谢谢!

回答

8

每个骨干模型具有hasChanged method

hasChangedmodel.hasChanged([attribute])

自上次"change"事件具有典型的改变?如果属性已通过,则返回true,如果该特定属性已更改。

也许你可以用它来检查你的第三种可能性。

顺便说一句,回调不是异步的。错误和更改的回调触发并set returns之前返回:

set : function(attrs, options) { 
    //... 

    // Run validation. 
    if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; 

    //... 

    // Update attributes. 
    for (var attr in attrs) { 
    var val = attrs[attr]; 
    if (!_.isEqual(now[attr], val)) { 
     now[attr] = val; 
     delete escaped[attr]; 
     this._changed = true; 
     if (!options.silent) this.trigger('change:' + attr, this, val, options); 
    } 
    } 

_performValidation呼叫触发错误回调时,this.trigger通话将调用每个属性的回调。

+0

谢谢!我的印象是异步的。 我会尝试使用hasChanged ... –

+0

@Che:任何碰到服务器的东西('sync','save',...)将是异步的,只有在浏览器中发生的任何事情都是同步的和顺序的。 –

+0

看看上面的代码。 hasChanged()查找'this._changed',如果不将模型设置为新值,它将不会被触及。所以这是行不通的。 – maxl0rd

0

在这种情况下,您可能需要在Model.set()附近跳舞以获得所需的位置。如果您正在使用此功能,那么您应该在模型上定义了一个validate()方法。

http://documentcloud.github.com/backbone/#Model-validate

这样你就可以直接调用此方法...

// something happens and we need to update the model to "newvalues" 
if (model.validate(newvalues)) { 
    model.trigger('error') 
} else { 
    model.trigger('change') 
} 
model.set(newvalues) 

这样,你总是会至少获得“变”或“错误”出来的,即使是相同的。您仍然可以从设置中获取现有的事件。