我正在创建一个地理定位模型,从localStorage获取,并检查我是否有纬度属性。如果没有,则触发'geolocation:city_state_blank'
事件。如果听到'geolocation:city_state_blank'
,则会触发@get_users_geolocation()
。
class App.GeoLocation extends Backbone.Model
initialize: ->
@on 'geolocation:city_state_blank', -> @get_users_geolocation()
@fetch().always =>
if @get('city_state').length is 0
@trigger 'geolocation:city_state_blank'
else
@trigger('geolocation:done')
get_users_geolocation: =>
# Code to get / save (in localStorage) a users geolocation and city / state
@trigger('geolocation:done')
完成get_users_geolocation()
后,会触发事件geolocation:done
。
我删除了获取用户geoLocation / reverse Geolocation查找的详细信息,这些查找都是异步的。但所有这些工作的最终结果归结为触发geolocation:done
事件。
class App.GeolocationView extends Backbone.View
initialize: =>
@listenTo @model, 'geolocation:done', =>
alert('geolocation:done was heard in the view!!!!')
在Geolocation模型从localStorage获取并确定属性latitude
未设置并因此调用get_users_geolocation
的情况下 - 查看警报地理位置:已完成在视图中!!!!
但是在Geolocation具有纬度属性(else)并且立即触发geolocation:done
的情况下,View 不会提醒任何内容。视图没有听到。
我已经控制了。记住了这个地狱,并且可以说流路正在运行。 if / else正在运行,View正在被正确实例化。从localStorage获取后在回调中记录会产生这个..
@fetch().always =>
console.log @get('current_city_state')
console.log typeof @get('current_city_state')
// Norfolk, VA
// String
所以那里有数据..
发生什么事了?请帮助!!
答案 0 :(得分:2)
我猜你latitude
的{{1}}属性是一个数字。这会让你的测试看起来像这样:
App.GeoLocation
数字没有if some_number.length is 0
属性,因此length
将不确定,您将离开:
@get('latitude').length
这将始终为假,因此始终会调用if undefined is 0
。
如果您对@trigger('geolocation:done')
属性的存在感兴趣,那么CoffeeScript的存在运算符(latitude
)将为您提供更好的服务:
?
要了解if @get('latitude')?
# There is a latitude.
else
# No latitude.
的行为方式,您可以查看其中的内容:
?
这将为您提供class M extends Backbone.Model
m = new M(p: 0)
if m.get('p') == 0
console.log('p == 0')
else
console.log('p != 0')
if m.get('p')?
console.log('there is a p')
else
console.log('the p is a lie')
if m.get('no')?
console.log('yes no')
else
console.log('no no')
,p == 0
和there is a p
。
答案 1 :(得分:0)
我最终这样做了。它很漂亮,但它确实有效。
@listenTo @model, 'geolocation:done', =>
@prefill_location_input()
@initialize_autocomplete()
@prefill_location_input()
@initialize_autocomplete()
我认为你的权利,事件是在init返回之前触发的。在这里,如果Object立即就绪,@prefill_location_input()
和@initialize_autocomplete()
被调用,geolocation:done
将覆盖它从网络中获取的情况。