2012-08-11 90 views
3

我注意到,一些網站提供了Ajax的伊恩搜索該刷新URL,並顯示使用GET參數,可以例如:如何使用Backbone使用params創建自定義GET url?

someapp.com/search/Tokyo?price_min=80 & PRICE_MAX = 300

作爲Ajax GET請求的結果。

我想知道我怎麼能做到這一點,通過使用Backbone.js的,據我所知,通過骨幹按壓狀態這是可能的,對嗎?

我怎樣才能爲Place模型定義類似這樣的路線(比如說,範圍相同的搜索範圍)?

我該在哪裏做?在路由器或模型中?

我很感謝所有關於此主題的答案。我通常會提前道歉,因爲我沒有提供任何代碼,但這個練習將成爲我想要提出的概念的證明,我希望骨幹網是這項工作的正確工具。

謝謝!

+1

請參閱我對類似問題的回答[stackoverflow.com/questions/7445353/key-value-pair-params-handling-in-backbone-js-router/8184621#8184621](http://stackoverflow。 com/questions/7445353/key-value-pair-params-handling-in-backbone-js-router/8184621)#8184621) – avrelian 2012-08-12 07:28:49

+0

謝謝你,看起來有趣,我會看看它,你怎麼看待這個回答:http:// stackoverflow。com/questions/6659283/backbone-js-fetch-with-parameters – jlstr 2012-08-12 14:34:59

+1

我認爲從路由器開始是一個更好的主意。您可以(以編程方式或從地址欄導航)到'someapp.com/search/Tokyo?price_min = 80&price_max = 300',路由器解析您的參數,並通過'collect.fetch({data:$ .param({price_min:80,price_max:300})});'或通過您的集合的自定義「sync」方法。當然,你可以用相反的方式來做,但在這種情況下,處理書籤鏈接將會很困難。 – avrelian 2012-08-12 17:59:54

回答

5

這是解決方案的一個工作示例 - jsfiddle.net/avrelian/dGr8Y/,只是jsFiddle不允許Backbone.history.navigate方法正常工作。

假設,我們有一個按鈕

<input class="fetch-button" type="button" value="Fetch" />​ 

和處理

$('.fetch-button').click(function() { 
    Backbone.history.navigate('posts/?author=martin', true); 
}); 

這是我們的帖子收集

var Posts = Backbone.Collection.extend({ 
    url: 'api/posts' 
}); 

這是我們使用自定義參數提取

路由器
var Router = Backbone.Router.extend({ 
    routes: { 
     'posts/?:filters': 'filterPosts' 
    }, 
    filterPosts: function(filters){ 
     posts.fetch({data: $.param(filters)}); 
    }, 
    _extractParameters: function(route, fragment) { 
     var result = route.exec(fragment).slice(1); 
     result.unshift(deparam(result[result.length-1])); 
     return result.slice(0,-1); 
    } 
}); 

它是簡化$ .deparam模擬。你可以使用你自己的。

var deparam = function(paramString){ 
    var result = {}; 
    if(! paramString){ 
     return result; 
    } 
    $.each(paramString.split('&'), function(index, value){ 
     if(value){ 
      var param = value.split('='); 
      result[param[0]] = param[1]; 
     } 
    }); 
    return result; 
}; 

最後,帖子收集和路由器對象

var posts = new Posts; 

var router = new Router; 
Backbone.history.start(); 

當用戶點擊該按鈕地址欄更改爲myapp.com/s/#posts?author=martin的實例。請注意標記#。我們使用一個哈希查詢字符串。當然,你可以使用push state,但它還沒有被廣泛使用。

+0

是啊!看起來這是我需要的,真棒,非常感謝你! 讓我研究一下。它似乎導航方法的伎倆,對吧? – jlstr 2012-08-12 22:50:17

+0

這個練習對它的功能非常清楚,但是,我確實有一個問題,路由器的'_extractParameters'方法被調用了哪一點? (我明白,解析GET url params,對吧?)再次感謝! – jlstr 2012-08-12 23:14:32

+0

路由器的_bindRoutes方法是從路由器構造函數調用的。它爲路由器的每個路由調用路由方法。該方法使用特殊的回調函數調用'Backbone.history.route'方法,該方法應該在調用時調用'_extractParameters'方法。這個回調被添加到'Backbone.History'的'handlers'數組中。 – avrelian 2012-08-13 19:37:45