1

皆さん、次の状況でのベストプラクティスとAPIの詳細について疑問に思っています。

モデル選択があるとしましょう:

Selection = Backbone.Model.extend({
  defaults: {
    value : null,
    related: null,
    other: null,
    stuff: null
  }
}

'related'も設定せずに'value'だけを変更する場合は、'related'をnullに設定します---カスケード更新のソート。

'value'が変更されたときに'related'の更新された値を確認する必要がある他のリスナーがあります。したがって、これらのリスナーのいずれかが呼び出されたときに、それに応じて「関連」が更新されることを保証したいと思います。

したがって、おそらく、Selectionモデル自体に「change:value」をリッスンさせ、必要に応じて「related」を設定することができます。しかし、Backboneは、そのリスナーが'change:value'の他のリスナーの前に呼び出されることを保証しますか?同様に、修飾されたイベントが一般的なイベントの前に発生することが保証されているので、「change:value」は「change」の前にありますか?

これを行うためにイベントシステムに依存することは壊れやすいように思われるので、私たちはいくつかのフックを探しました。見つけることができる最も近いものは_validate/validateメソッドであり、Selectionモデルに次のようなものを追加できます。

// Use _validate as a "before-set call" to set 'related' if necessary
_validate: function(attrs, options) {
  if (!_.has(attrs, 'related') && _.has(attrs, 'value') && 
      !_.isEqual(attrs.value, this.attributes.value)) {
    attrs.related = null;
  }
  return true;
}

もちろん、これは「検証」によって暗示されるセマンティクスに反します。

どんなガイダンスでも大歓迎です。

4

2 に答える 2

0

Backbone.Model setメソッドは複数の属性の受け渡しをサポートしているため、オーバーライドすることをお勧めします。

線に沿った何か(CoffeeScriptを使用して申し訳ありません-superここでは少し簡単です):

class myView extends Backbone.View
   set: (attributes, options) ->
       if attributes.value == "something"
             attributes.related = null
             #set all the cascade updates in the attributes object
       super(attributes,options)
于 2013-03-20T17:54:26.820 に答える
0

Model.setをオーバーライドしてテストを含めることができます。

それらの線に沿ったもの:

var Selection = Backbone.Model.extend({
    defaults: {
        value : null,
        related: null,
        other: null,
        stuff: null
    },

    set: function(key, val, options) {
        var attrs;

        //nothing to set
        if (key == null) return this;

        if (typeof key === 'object') {
           // setting a hash
            attrs = key;
            options = val;
        } else {
           // setting a key-value pair
            (attrs = {})[key] = val;
        }

        // set related values
        if (!_.has(attrs, 'related') && _.has(attrs, 'value') &&  
                  !_.isEqual(attrs.value, this.attributes.value)) {
            attrs.related = null;
        }

        // call the parent
        Backbone.Model.prototype.set.call(this, attrs, options);
    }
});

そしてフィドルhttp://jsfiddle.net/nikoshr/KSHwc/

于 2013-03-20T17:59:01.610 に答える