避免在Coffeescript中命名冲突的最佳做法是什么,特别是考虑到嵌套作用域和Ajax回调的上下文?
我遇到名称冲突问题,我的命名约定规定Ajax回调中的数据名称与我的范围中的另一个对象相同。
在下面的代码中,我将所有函数放在对象notifications
上,但是来自我的Ajax GET请求的数据被命名为notifications
。结果显然会导致错误:
# Handles initial get request.
notifications.init = ->
$.ajax 'notifications',
type: 'GET'
dataType: 'json'
error: (jqXHR, textStatus, errorThrown) ->
alert textStatus
success: (notifications, textStatus, jqXHR) ->
if notifications?
filteredNotifications = notifications.filteredNotifications notifications
notifications.behavior notifications
# Triggers the notifications
notifications.behavior = (filteredNotifications) ->
if filteredNotifications?
$('#counter').html filteredNotifications.length
if parseInt($('#counter').html()) > 0
$('#counter').css
'background': 'black'
# Removes notifications sent by the current user, copies for the other user,
# and notifications marked as observed.
notifications.filteredNotifications = (notifications) ->
filteredNotifications = filteredNotifications.filter((notification) ->
notification.recipients.username is $username() and
notification.copy_for_user_id is $id() and
notification.observed is false
)
return filteredNotifications
我已经考虑了Ajax回调中数据对象的notifications
的各种缩写,但它降低了可读性。以不同方式命名父对象也不合适。
答案 0 :(得分:0)
这是我的推销。正如你所说,这个主题是非常主观的,但我试图保持这个相当标准。
两个要点:
我专门使用标识符data
作为JSON回调中的数据对象的名称。这减少了任何阅读回调的人的困惑,并有助于消除你遇到过的冲突。
notifications = new class
init: -> $.ajax 'notifications',
type: 'GET'
dataType: 'json'
error: (jqXHR, textStatus, errorThrown) ->
alert textStatus
success: (data, textStatus, jqXHR) =>
if data?
@behavior @filter data
# Triggers the notifications
behavior: (notifications) ->
if notifications?
$('#counter').html notifications.length
if notifications.length?
$('#counter').css
'background': 'black'
return
# Removes notifications sent by the current user, copies for the other user,
# and notifications marked as observed.
filter: (notifications) ->
return notifications.filter (notification) ->
notification.recipients.username is $username() and
notification.copy_for_user_id is $id() and
notification.observed is false
notifications.init()
我做了一些其他的小改动,我冒昧地在behavior
进行逻辑更改,这可能不适合你的情况,但你无论如何都应该修改那里的逻辑。使用DOM在应用程序逻辑中存储所需的值是不明智的。
需要注意的重要事项是在=>
回调中使用“胖箭头”(success
)。这是必需的,因此您可以将函数绑定到正确的上下文,并正确解析@behavior
和@filter
。