2

私はすべて独自の緯度/経度プロパティを持つ会場オブジェクトのコレクションを持っています。これとユーザーの位置を使用して、ユーザーと各会場の間の距離を計算できます。

私の問題は、Venueオブジェクトが作成されたときにのみこれを実行できないため、位置変数を監視するか関数をトリガーすることによって、位置変数が更新されたときにこの計算をトリガーする必要があることです。どちらの方法でも。

window.App = {};

// Venue Object
App.Venue = Backbone.Model.extend({
  urlRoot: '/rest/venue',
  defaults: {
    distance: ''
  },
  initialize: function(){
    console.log(App.position);
    this.set('distance', getDistance(App.position.coords.latitude, App.position.coords.longitude, this.get('latitude'), this.get('longitude')));
  },
  events: {
    // Doesn't seem to work
    App.position.on('change', function() { console.log('change event'); })
  },
  updateDistance: function() {
    console.log('updateDistance');
  }
});

// Venues Collection Object
App.Venues = Backbone.Collection.extend({
  url: '/rest/venues',
  model: App.Venue,
  comparator: function(venue) {
    return venue.get('name');
  }
});

$(document).ready(function(){

  // Setup Model
  App.venues = new App.Venues();

  App.venues.fetch();

  navigator.geolocation.watchPosition(gotPosition);

  function gotPosition(position) {
    console.log(position);
    App.position = position;
    // Somehow trigger updateDistance function on all model objects?
  }
});

ここでの正しいアプローチは何ですか?

4

1 に答える 1

4

これに対処するには2つの方法があります。

位置はBackbone.Modelです

位置が単純な変数ではなくバックボーンモデルである場合は、次のようにすることができます。

// Give the position to each venue    
App.venues = new App.Venues({position: position}); //doesn't matter if the position variable is just empty right now.

App.Venueモデルの初期化メソッドで:

App.Venue = Backbone.Model.extend({
...
initialize: function(options) {
   this.position = options.position //save the reference
   this.listenTo(this.position, "change", positionChanged) //now your venue model is watching this position object. any change and positionChanged method will be called
},

positionChanged: function (model) {
// position updated

}

グローバルイベントアグリゲーター

したがって、何らかの理由でBackboneモデルとしての位置がない場合は、Backbone.Eventsモジュールを拡張して独自のイベントアグリゲーターを設定できます。

App.vent = _.extend({}, Backbone.Events);

位置が更新されるたびに、イベントをトリガーします。

function gotPosition(position) {
    console.log(position);
    App.position = position;
    App.vent.trigger("position:updated") // you could name this event anything.
 }

会場モデルでは、イベントを聞きます。

App.Venue = Backbone.Model.extend({
    ...
    initialize: function(options) {
        App.vent.on("position:updated", this.positionChanged)
    },

私は最初の方法を好みます!

于 2013-03-19T06:45:38.887 に答える