我有一个显示几个输入字段的视图设置。当任何一个字段被更改时,我想保存模型的更改值。
以下是我的观点:
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);
}
}
答案 0 :(得分:0)
好吧,看起来像
this.model.bind 'change', this.render
从内部调用render方法,它首先进行了一次获取并覆盖了我的更改。然后没有进行保存,因为属性没有被更改。
它总是会像那样......