Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干模型绑定器:属性不在模型上_Backbone.js_Model Binding_Marionette_Backbone Views - Fatal编程技术网

Backbone.js 主干模型绑定器:属性不在模型上

Backbone.js 主干模型绑定器:属性不在模型上,backbone.js,model-binding,marionette,backbone-views,Backbone.js,Model Binding,Marionette,Backbone Views,Im使用带有主干模型绑定器的主干木偶 使用下面的代码,如果完成了select+input[type=date]的默认设置,并且用户没有更改它们,那么当用户单击“保存”时,模型属性返回为空。如果用户编辑字段并单击“保存”,则会在“模型”属性上设置该字段 define(["marionette", "underscore", "text!app/templates/sicknesses/form.html", "app/models/sickness", "app/collections/users

Im使用带有主干模型绑定器的主干木偶

使用下面的代码,如果完成了select+input[type=date]的默认设置,并且用户没有更改它们,那么当用户单击“保存”时,模型属性返回为空。如果用户编辑字段并单击“保存”,则会在“模型”属性上设置该字段

define(["marionette", "underscore", "text!app/templates/sicknesses/form.html", "app/models/sickness", "app/collections/users"], function(Marionette, _, Template, Model, Users) {
  "use strict"
  return Backbone.Marionette.CompositeView.extend({
    events: {
      "click #createButton": "onClickSave"
    },
    _modelBinder: undefined,
    initialize: function(options) {
      var that
      this._modelBinder = new Backbone.ModelBinder()
      this.mode = 'create'
      this.users = new Users()
      this.users.on("reset", this.render, this)
      this.users.fetch()
      this.model = new Model()
    },
    onClickSave: function(ev) {
      ev.preventDefault()
      console.log(this.model.attributes)
    },
    render: function() {
      var bindings, html
      if (this.users.length > 0) {
        bindings = {
          start_date: "#start_date",
          end_date: "#end_date",
          sicknote: "#sicknote",
          user: "#user"
        }
        html = _.template($(Template).html(), {
          model: this.model.toJSON(),
          users: this.users.toJSON(),
          mode: this.mode
        })
        this.$el.html(html)
        this._modelBinder.bind(this.model, this.$el, bindings)
      }
      return this
    }
  })
})

这是正确的行为。数据应该由模型而不是视图驱动

“调用绑定函数时,将模型的属性从模型复制到绑定元素。调用绑定时,不会将视图元素默认值复制到模型。这种行为通常属于主干。模型默认值块。” 我们有一个类似的用例来使用视图初始化模型,并且添加了一个特性来将初始数据从视图复制到模型

“如果在调用bind时确实需要将值从视图复制到模型,我首先会问为什么。在大多数情况下,尤其是对于单页web应用,让模型驱动应用程序的行为而不是视图几乎总是更好的。如果需要此行为,可以使用bind的第四个可选参数。”nction.{initialCopyDirection:Backbone.ModelBinder.Constants.ViewToModel}您还可以通过调用Backbone.ModelBinder.SetOptions{initialCopyDirection:Backbone.ModelBinder.Constants.ViewToModel}将此行为指定为所有ModelBinder的默认行为 需要更新bind调用以添加第4个参数:

this._modelBinder.bind(this.model, this.$el, bindings, {initialCopyDirection: Backbone.ModelBinder.Constants.ViewToModel});

希望这有帮助

您是否暗示我的模型默认值应该定义预选值而不是html表单?没有预设值的选择默认为列表中的第一项?这真的取决于你。如果保留现有内容,则需要在调用bind时添加“initialCopyDirection:Backbone.ModelBinder.Constants.ViewToModel”,以便将视图中的初始值复制到模型中。非常感谢,这就解决了问题。除了返回为空的输入[type=date]。我想知道它的实现是否还有待完成。您的意思是在调用bind时视图是空的?在JQM环境中使用它时,我遇到了问题。这是一个与时间有关的问题。看看这个是否有用。尝试了上述代码,但不管是什么,唯一不能正常工作的html元素是: