Backbone Model有条件地触发事件,View不会听到它

时间:2013-05-08 16:17:33

标签: javascript events backbone.js coffeescript

我正在创建一个地理定位模型,从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

所以那里有数据..

发生什么事了?请帮助!!

2 个答案:

答案 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 == 0there is a p

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

答案 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将覆盖它从网络中获取的情况。