使用backbone.js在视图中保存模型时遇到问题

时间:2011-08-16 14:37:38

标签: backbone.js

我有一个显示几个输入字段的视图设置。当任何一个字段被更改时,我想保存模型的更改值。

以下是我的观点:

  EditWordView = Backbone.View.extend({
tagName: 'article',
className: 'word',

initialize: () ->
  _.bindAll this, 'render'

  this.template = _.template($('#edit-word-template').html())
  this.model.bind 'change', this.render
,
events: {
  "change input": "changed"
},

render: () ->
  this.model.fetch()
  $word = $('#word')
  $word.empty()
  renderContent = this.template(this.model.toJSON())
  $(this.el).html(renderContent)
  $word.append(this.el)
  this
,
changed: (event) ->
  changed = event.currentTarget
  value = $("#" + changed.id).val()
  obj = {}
  obj[changed.id] = value
  this.model.save(obj)
,
save: (event) ->
  this.model.save()
  view = new WordView({model: this.model})
  view.render()
  event.preventDefault()
})

这是模特:

SpellingWord = Backbone.Model.extend({
url: () ->
  '/spelling_words/' + this.id
})

当我到达已更改的事件并尝试保存模型时

this.model.save(obj)

无效

在backbone.js中的save方法中,模型上调用了set(attrs)方法,但是模型中的值永远不会改变,因此永远不会持久化回到后端。这与this.model对象的范围有关吗?

如果我打电话

this.model.set(obj)

在this.model.save(obj)之前,模型属性的值永远不会改变。

set(attrs)在控制台中为对象工作,所以我有点难以理解为什么它不会出现在我看来。

想法?

编辑>>>>>>>

我已经挖掘了骨干代码并且在保存方法 set 中被调用:

save : function(attrs, options) {
  options || (options = {});
  if (attrs && !this.set(attrs, options)) return false;
  var model = this;
  var success = options.success;

调用this.set(attrs,options)方法后,模型的属性不会改变。

现在,查看 set 方法,当实际更改 now 变量时,我看不到该属性应该如何更改?

var now = this.attributes, escaped = this._escapedAttributes;
// Run validation.
if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;
// Check for changes of `id`.
if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
// We're about to start triggering change events.
var alreadyChanging = this._changing;
this._changing = true;
// 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);
  }
 }

1 个答案:

答案 0 :(得分:0)

好吧,看起来像

this.model.bind 'change', this.render

从内部调用render方法,它首先进行了一次获取并覆盖了我的更改。然后没有进行保存,因为属​​性没有被更改。

它总是会像那样......