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 / 逆 Geolocation ルックアップのフェッチの詳細を削除しました。geolocation:doneしかし、すべての作業の最終結果は、イベントのトリガーに要約されます。

class App.GeolocationView extends Backbone.View
   initialize: =>
      @listenTo @model, 'geolocation:done', =>
        alert('geolocation:done was heard in the view!!!!')

問題は次のとおりです。

地理位置情報モデルが localStorage から取得し、プロパティlatitude設定されていないと判断したシナリオでは、呼び出しますget_users_geolocation — View alerts geolocation:done がビューで聞こえました!!!!

geolocation:doneしかし、地理位置情報に緯度プロパティ (その他) があり、すぐにトリガーされるシナリオでは、ビューは何も警告しません。ビューはそれを聞きません。

私はこれをconsole.loggedしましたが、フローパスが機能していると言えます。if/else が機能しており、View が正しくインスタンス化されています。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

それは常にfalseになるため、@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 == 0there is a p、およびが得られますno 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が戻る前にイベントがトリガーされると思います。ここで、オブジェクトがすぐに準備できた場合、@prefill_location_input()@initialize_autocomplete()が呼び出さgeolocation:doneれ、ネットワークからフェッチされた場合に上書きされます。

于 2013-05-08T20:53:43.973 に答える