在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会通过引用设置 - 实质上是创建一个计算别名 - 而不是按值设置?
答案 0 :(得分:0)
这只是一个猜测:
@set('selected_date_range', Ember.copy(date_range, true))
这应该创建date_range
对象的深层副本。