2

私は CoffeeScript で Backbone.js を使用してプログラミングしていますが、lodash とマージ機能に関連する継承に問題があります。

スーパークラスがある

class NavigationView extends Backbone.View
  config:
    test:
      string: "Test"

およびそれから派生した 2 つのクラス

class SubView extends NavigationView

  initialize: ->
      # Setting the view's template property using the Underscore template method
    _.merge @config, {
        test:
          string: "bla"
      }

class IndexView extends NavigationView
...

SubView の関数内で変更すると、config 変数が初期化され、IndexView のインスタンスでも変更されます。

BackBone.Router クラス内で、次のようにオブジェクトをインスタンス化します。

index: () ->
    # Instantiates a new view which will render the header text to the page
    new IndexView()

  sub: () ->
    new SubView()

それを示すためにフィドルを作成しました:http://jsfiddle.net/hijolan/9VeND/

それを行う方法はありますか?

よろしく、ヒジョラン

4

1 に答える 1

4

あなたの問題は_.merge、最初の引数をその場で変更することです:

_.merge(object [, source1, source2, …])

ソース オブジェクトの列挙可能なプロパティをオブジェクトにマージしdestinationます。

destinationドキュメントが実際に意味すると言っていることに注意してくださいobject。の意図はmergeの深いバージョンになることで_.extendあり、アンダースコアのドキュメントは何が起こるかについて明示的です:

拡張する _.extend(destination, *sources)

ソースオブジェクトのすべてのプロパティをコピー先オブジェクトにコピーし、コピーオブジェクトを返します。

extendlodash の(AKA assign)もパラメーター名が混同されていることに気付くでしょう。

_.assign(object [, source1, source2, …])

オブジェクトの独自の列挙可能なプロパティをsourceオブジェクトに割り当てdestinationます。

繰り返しますobjectが、彼らが言うとき、彼らは意味しますdestination

これを行う場合:

class NavigationView extends Backbone.View
  config:
    test:
      string: "Test"

は最終的に andconfigのプロトタイプにアタッチされるNavigationViewため、まったく同じconfigオブジェクトがNavigationViewおよびそのサブクラスによって認識されます。つまり@config、プロトタイプconfigはあなたの中にありますinitialize:

_.merge @config, { test: { string1: "blub" } }

そのため_.merge、新しい値がプロトタイプにマージされ、その変更がすべてのサブクラスにconfig至るまで可視化されます。継承をさかのぼって追跡すると、そのコンテキストでは from であるNavigationViewことがわかります。したがって、 yourはトリッキーで紛らわしい書き方です。@configNavigationView_.merge

_.merge NavigationView::config, ...

問題の根本は、最初の引数_.extendを変更することです。_.mergeこのトラップから抜け出す方法は、安全に書き込み可能な宛先オブジェクトを提供することです。

@config = _.merge { }, @config, { test: { string1: 'blub' } }
# ----------------^^^

デモ: http://jsfiddle.net/ambiguous/7j2FM/

于 2013-01-04T22:40:13.043 に答える