1

バックボーン モデル バインダーでバックボーン マリオネットを使用しています。

以下のコードでは、select + input[type=date] のデフォルトが完了し、ユーザーがそれらを変更しない場合、ユーザーが保存をクリックすると、モデル属性は空に戻ります。ユーザーがフィールドを編集して保存をクリックすると、その 1 つのフィールドがモデル属性に設定されます。

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
    }
  })
})
4

1 に答える 1

2

それが正しい振る舞いです。データは、ビューではなくモデルによって駆動される必要があります。

ドキュメントから

  • 「バインドされたモデルの属性は、bind() 関数が呼び出されると、モデルからバインドされた要素にコピーされます。bind() が呼び出されたときに、ビュー要素のデフォルト値がモデルにコピーされません。このタイプの動作は通常、Backbone.Model のデフォルト ブロックに属します。」</li>

ビューでモデルを初期化する同様のユースケースがあり、ビューからモデルに初期データをコピーする機能が追加されています

  • 「 bind() が呼び出されたときにビューからモデルに値をコピーする必要がある場合、まず理由を尋ねます。ほとんどの場合、特に単一ページ Web アプリの場合、ほとんどの場合、ビューではなくモデルでアプリの動作を駆動する方が適切です。この動作が必要な場合は、4 番目のオプション パラメータを bind() 関数に使用できます。{initialCopyDirection: Backbone.ModelBinder.Constants.ViewToModel} Backbone.ModelBinder.SetOptions({initialCopyDirection: Backbone.ModelBinder.Constants.ViewToModel}); を呼び出して、すべての ModelBinder のデフォルトとしてこの動作を指定することもできます。」</li>

バインド呼び出しを更新して、4 番目のパラメーターを追加する必要があります。

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

この助けを願っています!

于 2013-09-25T14:36:30.970 に答える