Backbone路由不适用于Laravel

时间:2014-12-07 20:17:56

标签: javascript php backbone.js laravel

我不确切地知道错误/是在哪里。

我正在做一个单页应用程序,这是上下文:

  1. 我在Laravel中有一个资源控制器,可以观察这条路线" domain.dev/v1 /"
  2. Laravel提供第一页/视图" /public/views/layouts/application.blade.php"
  3. 小胡子视图存储在" public / views /"当它们被Backbone路由器调用时它们被同步加载(我已经修改了" app / config / view.php"文件来提供来自bakcbone的视图)
  4. 在骨干网中,路由器控制每个URI更改,甚至是pushstate和相应的Mustache视图。一切似乎工作正常,但如果你为用户列表或用户键入直接URI ...你只看到服务器返回的JSON,而不是相应的Backbone View,换句话说,我不知道哪个不做正确的工作,Laravel路由器或Backbone路由器。或者它是Laravel配置?
  5. 到目前为止,这是我的代码:

    // app/routes.php
    
    Route::group(['prefix' => 'v1'],function (){
    
        Route::resource('users','V1\UsersController');
    
        Route::get('/', function()
        {
          return View::make('layouts.application')->nest('content', 'app');
        });
    });
    
    
    // app/controllers/V1/UsersController.php
    
    namespace V1;
    
    //import classes that are not in this new namespace
    use BaseController;
    use User;
    use View;
    use Input;
    use Request;
    
    class UsersController extends \BaseController {
    
        public function index()
        {
            return $users = User::all(['id','email','name']) ;
        }
    
        public function show($id)
        {
            $user = User::find($id,['id','email','name']);
    
            if(is_null($user)){
                return array(
                    'id' => 0,
                    'email' => 'fake email'
                    );
            }
            return $user;
        }
    
    // public/js/namespaces.js
    
    (function(){
    
        window.App = {
            Models : {},
            Collections : {},
            Views : {},
            Router : {}
        };
    
        window.Templator = function (mustacheView){
            return $.ajax({
                url: '/views/'+mustacheView,
                async : false,
                type: 'GET',
            }).responseText;
        };
    
        window.Vent = _.extend({},Backbone.Events); 
    
    })();
    
    // public/js/backbone/router.js
    
    App.Router = Backbone.Router.extend({
        routes : {
            '' : 'home',
            'users' : 'showAll',
            'users/:id' : 'showUser',
            'login' : 'showLoginForm'
        },
        home: function (){
            Vent.trigger('home:index');  
        },
        showAll : function (){
            Vent.trigger('users:showAll');  
        },
        showUser: function (id){
            Vent.trigger('users:show',id);  
        },
        showLoginForm : function (){
            Vent.trigger('login:form');  
        }
    });
    
    
    // public/js/app.js
    $(function() {
    
        $(document).on("click", "a", function(e){
            var href = $(this).attr("href");
    
          if (href != '#')  {
            e.preventDefault();
            Backbone.history.navigate(href,{trigger:true});
          }
        });
    
        new App.Views.AllUsers;
        new App.Views.Index;
        new App.Views.Login;
        new App.Router;
    
        Backbone.history.start({ 
            pushState: true, 
            silent: true,
            root: '/v1' 
        });
    });
    

    所以,如果我输入这个URI" domain.dev/v1/users"在导航栏上,显示JSON中的用户列表,并且不显示与骨干相关联的视图。 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

看一下我刚才给出的关于Angular的类似问题的答案:Angular and Laravel

在文字中,只需在心理上将Angular替换为Backbone

如何将路线从Laravel传递到Backbone:

从Laravel为'/'路由返回的基本视图需要在<head> 之前的某个地方包含 backbone.js之类的内容:

<script>
    var myRoute = "{{ $route }}";
</script>

此刀片模板会创建一个Javascript变量。然后,在Backbone中声明路由后,添加:

Backbone.history.start(); // You should already have this line, so just add the next one
App.nav.navigate(myRoute);

这应该可以解决问题。