2

我试图了解使用 Backbone.js 获取数据后如何以及在何处使用数据,但我有点困惑。
我会说明情况。
我有一个应用程序,它在启动时从服务器获取一些数据。三种不同类型的数据。
让我们假设飞机、自行车、汽车。
为此,我在三个集合(飞机、汽车、自行车)中插入了获取这些数据的 url。
我已经覆盖了 parse 方法,所以我可以修改我得到的字符串,对其进行排序,然后将它放入一个对象和 localstorage 中。我需要它是持久的,因为我需要使用这 3 个数据结构。
因此,通过获取,我得到所有这些数据并将它们放入本地存储中。这样做是否正确?

现在我需要对服务器进行其他调用,例如“获取最近的汽车”。
在视图中,我需要查看汽车的颜色、名称和型号,所有这些信息都在本地存储中的“汽车”对象中。
在我看来,“showcars.view”我只是调用了一个非主干 js,(不是集合、模型或视图),在那里我可以获得我需要的所有信息。在这个js中我做:

var carmodel = new Car(); //car is the backbone model of the cars
carmodel.url = '/get/nearest/car'; //that give id of the nearest car
carmodel.fetch ({
       success: function () {}
//here i search the Cars object for a car with the same id 
//and get name, color, model and put them in sessionstorage
})

所以在那次调用之后,在视图中我可以从会话存储中获取我需要的数据。这是一种不好的做事方式吗?如果是这样,我应该如何获取和分析这些信息?我应该在模型中进行所有调用和操作吗?
谢谢

4

2 回答 2

1

这将是您实现所需内容的方式。

var Car = Backbone.Model.extend();
var Cars = Backbone.Collection.extend({
  model: Car,
  url: '.../cars'
});
var NearestCar = Backbone.Model.extend({
  url: '...nearest/car'
});

var cars = new Cars();
var nearestCar = new NeaerestCar();
cars.fetch({
  success: function() {
    nearestCar.fetch({
      success: function(model) {
        var oneYouWant = cars.get(model.get('id'));
        // do something with your car
        // e.g.:
        // var carView = new CarView({model: oneYouWant});
        // $('body').append(carView.render().el);
      });
    });
  });
});
于 2013-09-20T09:39:27.987 回答
1

通常,Backbone 将所有内容保存在内存中(即浏览器内存),因此无需将所有内容保存到本地存储,只要您的 Collection 对象可以从您所在的范围内以某种方式访问​​(为了简单起见,让我们说这是全局window范围)。

因此,在您的情况下,我将拥有三个集合:

window.Cars
window.Airplanes
window.Bikes

现在你想要最近的。假设您在主干视图中并且正在响应事件,那么在您的位置我会做这样的事情(只显示有意义的代码):

var GeneralView = Backbone.View.extend({

    events: { "click .getNearestCar": "_getNearestCar" },

    _getNearestCar: function () {

        $.getJson('/get/nearest/car', function (data) {
            // suppose the data.id is the id of the nearest car
            var nearestCar = window.Cars.get(data.id)
            // do what you plase with nearestCar...
        });
    }

});
于 2013-09-20T09:40:02.897 回答