1

사용자가 북마크하거나 다음 URL을 공유 한 경우 전체 페이지를 렌더링하기 위해 내 페이지 backbone.js 응용 프로그램 (Backbone.Router 사용)이 필요한 데이터를 검색하는 방법은 무엇입니까? backbone.js 중첩 리소스 부트 스트랩

http://mydomain.example.com/menus#/menus/99/items/33/ingredients

사용자 내가 쉽게 메뉴의 첫 페이지를 부트 스트랩 할 수 http://mydomain.example.com/menus를 북마크합니다.
# Inline before </body>, in a <script> block 
Menus.reset(<%= @menus.to_json %>); 

그러나

의 I가 필요한 부트 스트랩의 3 층이야, 아직이 #hashtag 탐색이기 때문에, 서버가 메뉴의 메뉴 부트 스트랩 모르는, 위의 언급 경우 : menu_id, 항목의 항목 : ITEM_ID 그리고 재료의 첫 페이지.

# It would look like the following on a real page 
# http://mydomain.example.com/menus/99/items/33/ingredients 
# please see past the invalid syntax 
Menus.reset(<%= @menus.to_json %>); 
var menu = Menus.get(99); 
menu.items.reset(<%= @menus.find(99).items.find(:all).to_json %>); 
var item = Menus.items.get(33); 
item.ingredients.reset(<%= @menus.find(99).items.find(33).ingredients.find(:all).to_json %>); 

다른 사람들이이를 수행하는 데 사용할 수있는 패턴이 있습니까? 너에게 이해가 되니?

페이지를 그리는 데 필요한 모든 모델 및 컬렉션을 가져 오는 유일한 목적으로 부트 스트랩 컨트롤러를 만드는 것이 좋습니다./bootstrap? path =/menus/99/items/33/ingredients 그런 다음 호출자 페이지 http://mydomain.example.com/menus#/menus/99/items/33/ingredients에 jsonp를 반환해야합니다. 사전에

감사합니다.

답변

1

질문을 올바르게 이해하면 데이터가로드되지 않아 응용 프로그램 중간에 딥 링크가 있으면보기가 제대로 구성되지 않을 수 있다는 문제가 발생합니다.

여기서는 경로와보기 사이에 1 : 1 대응이 필요하지 않다는 것을 알아야한다고 생각합니다.

라우터가 이러한 상황을 감지하면 일반 "로드 중"보기를 표시하고 데이터를 가져 오기 시작한 다음 데이터가 도착하면 원하는보기를 표시 할 수 있습니다.

(이 메커니즘은 또한 연결할 수 있습니다. 예를 들어 로그인보기,로드보기, 최종보기를 표시 할 수 있습니다).

그래서 나는 유틸리티 기능과 같이있을 수 있습니다 :

awaitFoos = function (foos, callback) { 
    var loadingView = new CommonLoadingView(); 

    if (foos.isFetched) { 
    callback(); 
    } else { 
    this.showPageView(loadingView); 

    foos.fetch({success: callback}); 
    } 
}; 

그리고 라우터에, 내가 이것을 사용합니다 : 그것은 내가 지금 뭘하는지 때문에

goFooView: function (fooid) { 
    var self = this; 

    this.appView.awaitFoos(function() { 
    var model = self.getFoo(fooid), 
     view = new FooView({model: model}); 

    self.appView.showPageView(view); 
    }); 
} 
+0

나는 당신의 대답을 올렸다 (비슷한) #/menus/99에 맞지 않기 때문에 틀림없이 (내 의견으로는) :) #/menus/99/items33/ingredients –

+0

에 대한 중첩 콜백 지옥에 적합합니다. 하나의 접근법 (아직 시도하지 않은)은 약속/비동기 라이브러리 (예 : JQuery 약속, 노드 약속 또는 비동기 [https://github.com/caolan/async])의 일부 형식을 사용하는 것입니다. – stusmith

+0

나는 약속 도서관 중 하나에 소용돌이를 줄 것이다. 아이디어를 가져 주셔서 감사합니다. 아마도 두 개의 라우터를 만들 것입니다. 하나의 페이지로드 (think window.onload)에서만 페이지 (# menus/99/items/33/ingredients)에 필요한 모든 데이터를로드 한 다음 사용자가 응용 프로그램을 탐색 할 때 다른 라우터를로드합니다. 질문을 계속 열어두면 더 많은 아이디어가 들어올 것입니다. 나는이 질문을 한 유일한 사람이 될 것이라고 상상할 수 없습니다. 감사! –