2014-12-07 107 views
0

我不知道確切的錯誤在哪裏。Backbone路線不適用於Laravel

我正在做一個單頁應用程序,這是背景:即看這條路線「domain.dev/v1/」

  • Laravel服務第一

    1. 我有一個資源控制器Laravel頁面/視圖「/public/views/layouts/application.blade.php」
    2. 鬍鬚視圖存儲在「public/views /」下,它們在被骨幹路由器調用時同步加載(我修改了「app/config/view.php」文件服務於bakcbone的視圖)
    3. 在骨幹網中,路由器c處理每個URI更改,甚至pushstate和相應的Mustache視圖。一切似乎工作正常,但如果您鍵入用戶的列表或用戶的直接URI ...你只能看到服務器返回的JSON,而不是相應的骨幹視圖,換句話說,我不知道哪些不是做的正確的工作,Laravel路由器或骨幹路由器。或者它是一個Laravel配置?

    這是我到目前爲止的代碼:

    // 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和視圖的用戶列表不顯示關聯骨幹網絡。 有什麼建議嗎?

  • +0

    我對Backbone並不是特別熟悉,但就Laravel代碼而言,您正在得到您應該做的。您的控制器操作正在返回一組用戶,Laravel自動將其轉換爲JSON響應。如果你想從Laravel返回一個視圖,你應該返回'View :: make('view_name')',但我猜你有一些數據綁定正在從Backbone應用程序的視圖中進行,所以你需要處理如果到'/ v1/users'的直接路由返回一個視圖而不是一個數組。 – Bogdan 2014-12-07 21:13:56

    +0

    是的,你是對的@Bogdan .Laravel restful API只返回並接收JSON。但我認爲這個問題可能是BackBone中的「深層鏈接」。我現在很困惑,我不知道還有什麼地方要檢查 – Frankistan 2014-12-08 01:01:39

    回答

    0

    看一看我的答案,我只是在一個類似的問題提供了關於角:Angular and Laravel

    在文本,只是精神上與Backbone取代Angular

    如何從Laravel傳遞路線主幹:

    的基本觀點,那就是從Laravel返回爲'/'路由也需要有這樣的事情都在其<head>之前backbone.js包括:

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

    此刀片模板創建一個Javascript變量。然後,你宣佈你的主幹航線後,補充一點:

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

    這應該做的伎倆。

    +0

    我認爲你的解決方案可以工作@sisou,但是......如何處理傳遞給服務器呈現的主頁面的變量「route」? (在你的例子中 - >「return Redirect:to('/')」)。 – Frankistan 2014-12-08 15:58:24

    +0

    我還編輯了我的答案,以提供從Laravel獲取'route'變量到主幹的指示。 – sisou 2014-12-08 18:10:28

    +0

    這似乎是完美的,我會嘗試和評論你的結果;) – Frankistan 2014-12-10 00:00:22