【问题标题】:How can I be sure all collections have been populated?如何确定所有集合都已填充?
【发布时间】:2013-05-26 22:01:01
【问题描述】:

在呈现任何视图之前,我需要填充我的所有应用程序集合。但是,问题是,有时我必须刷新页面几次才能看到所有内容都已填充。

例如,当我知道数据库中有房间时,有时房间集合是完全空的。在这种情况下,服务器响应为空。

这是一个精简的实现:

(function() {
    window.rooms = new App.Collections.Rooms();

    $.when(rooms.fetch()).done(function() {
        window.router = new App.Router;
        Backbone.history.start();
    });
}());

这是从服务器返回房间的代码:

public function get_index() {
    $rooms = Room::where('id_hostel', '=', Session::get('id_hostel'))->get();
    $response = array();

    foreach($rooms as $room) {
        $response[] = $room->attributes;
    }

    return json_encode($response);
}

实际上我不知道错误是在客户端还是在我编写的 Laravel RESTful 服务中。我该如何解决这个间歇性问题?

【问题讨论】:

  • 如果返回的请求为空,这几乎肯定是服务器端问题。检查任何错误日志以查找无效查询或其他错误,并从服务器中转储$response 以查看其中包含的内容。如果需要重新加载几次才能开始工作,我会猜测这是您的会话。也就是说,Laravel 应该正确处理会话。
  • 尝试为您的 fetch 添加一个成功回调。如果你在那里记录响应,你会得到什么? rooms.fetch({success: function(model, response) { console.log(response); }});

标签: php javascript backbone.js laravel


【解决方案1】:

如果您参考 - Collection fetch ,则有几种方法可以处理此问题

Sidney 已经提到了第一种方法,那就是使用 fetchsuccess 回调。

第二种方法是使用events,在我看来更好,因为您可以更轻松地解耦代码并具有更好的可读性。

var rooms = window.rooms = new App.Collections.Rooms();
    rooms.fetch();
    ...
    rooms.on('sync', someFunction);

var rooms = window.rooms = new App.Collections.Rooms();
    rooms.fetch({reset: true});
    ...
    rooms.on('reset', someFunction);


someFunction () {
    window.router = new App.Router;
    Backbone.history.start();
}

尽管我必须说这不是做事的首选“主干方式”。我强烈建议您阅读Backbone Patterns

【讨论】:

    猜你喜欢
    • 2019-03-23
    • 2011-12-01
    • 2013-09-25
    • 1970-01-01
    • 2011-03-09
    • 2017-07-09
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多