0

我正在创建一个地理定位模型,从 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:done 在视图中听到!!!

但是在 Geolocation 具有纬度属性(else)并geolocation:done立即触发的情况下,视图不会发出任何警报。视图没有听到它。

我已经 console.logged 了,并且可以说流动路径正在工作。if/else 正在工作并且视图正在正确实例化。从 localStorage 获取后在回调中记录会产生这个..

@fetch().always => 
    console.log @get('current_city_state')
    console.log typeof @get('current_city_state')
    // Norfolk, VA
    // String

所以,那里有数据..

到底是怎么回事??请帮忙!!

4

2 回答 2

2

我猜latitude你的财产App.GeoLocation是一个数字。这将使您的测试看起来像这样:

if some_number.length is 0

数字没有length属性,因此@get('latitude').length将是未定义的,您将得到:

if undefined is 0

那总是错误的,所以@trigger('geolocation:done')总是被调用。

如果您对latitude属性的存在感兴趣,那么 CoffeeScript 的存在运算符 ( ?) 将为您提供更好的服务:

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 pno no.

演示:http: //jsfiddle.net/ambiguous/qmBNy/

于 2013-05-08T17:15:12.550 回答
0

我最终这样做了。它不漂亮,但它有效。

@listenTo @model, 'geolocation:done', =>        
   @prefill_location_input()
   @initialize_autocomplete()

@prefill_location_input()
@initialize_autocomplete()

我认为你的权利,事件是在 init 返回之前触发的。在这里,如果 Object 立即准备好,则调用@prefill_location_input()and将覆盖它,以防它从网络中获取。@initialize_autocomplete()geolocation:done

于 2013-05-08T20:53:43.973 回答