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

有两种处理方法。

Position 是一个 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 回答