为什么Ember是通过引用而不是按值设置的?

时间:2014-07-24 18:11:58

标签: ember.js set

在Ember(1.0.0rc6)中出现了一个奇怪的行为,我希望有人可以解释。在地图循环中,我最初写了@set('selected_date_range', date_range),假设date_range的副本将存储在selected_date_range中。但事实并非如此。存储了对date_range的引用,以便 - 在未找到匹配项时后续执行代码时 - 原始date_range将被“自定义”日期范围覆盖。

 selectDateRange: (date_range_value) ->
    # determine if passed in date range is in supported date range array
    isSupported = @get('supported_date_ranges').map((date_range) =>
      supported = if date_range_value is date_range.value
        # date_range must be copied otherwise future changes to
        # selected_date_range will modify the supported_date_ranges array. wtf.
        @set('selected_date_range', Ember.copy(date_range))
        true
      else
        false
      return supported
    ).reduce (memo, next) -> memo or next
    # date range value is not in supported array so it is custom
    unless isSupported
      @set('selected_date_range.value', date_range_value)
      @set('selected_date_range.title', 'Custom')
      @set('selected_date_range.name', 'custom')

为什么Ember会通过引用设置 - 实质上是创建一个计算别名 - 而不是按值设置?

1 个答案:

答案 0 :(得分:0)

这只是一个猜测:

@set('selected_date_range', Ember.copy(date_range, true))

这应该创建date_range对象的深层副本。