2013-12-11 43 views
0

我正在使用Controller來獲取URL。我需要一種方法將參數放在這個POST中。這些參數由用戶在查看&尚未存儲選擇(我不知道如何存儲)backbone.js搜索過濾系統[結構]

目前我設法

  1. 顯示&路線觀與搜索結果來自API
  2. 顯示未來並刷新頁面,當有人選擇過濾選項

問題

  1. 我不知道如何來記錄用戶點擊了哪些
  2. 我如何「重郵報」這樣我就可以得到新的結果集
  3. 我讀,說人說,POST取應型號進行, 集合是用於存儲多個模型,我不知道在這個 的情況下?

類別 Jobs.js

define([ 
     'jquery', 
     'underscore', 
     'backbone', 
     'models/filter' 
    ], function($, _, Backbone,JobListFilterModel){ 
     var Jobs = Backbone.Collection.extend({ 
      url: function() { 
       return 'http://punchgag.com/api/jobs?page='+this.page+'' 
      }, 
      page: 1, 
      model: JobListFilterModel 
     }); 
     return Jobs; 
}); 

類別Filter.JS

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'models/filter' 
], function($, _, Backbone,JobListFilterModel){ 
    console.log("Loaded"); 

    var Jobs = Backbone.Collection.extend({ 
     url: function() { 
      return 'http://punchgag.com/api/jobs?page='+this.page+'' 
     }, 
     page: 1, 
     model: JobListFilterModel 
    }); 

// var donuts = new JobListFilterModel; 
// console.log(donuts.get("E")); 

    return Jobs; 
}); 

模型 Filter.js

define([ 
    'underscore', 
    'backbone' 
], function(_, Backbone){ 
    var JobFilterModel = Backbone.Model.extend({ 
     defaults: { 
      T: '1', //Task/Event-based 
      PT: '1', //Part-time 
      C: '1', //Contract 
      I: '1' //Internship 
     } 
    }); 
    // Return the model for the module 
    return JobFilterModel; 
}); 

模型 Job.js

define([ 
    'underscore', 
    'backbone' 
], function(_, Backbone){ 
    var JobModel = Backbone.Model.extend({ 
     defaults: { 
      name: "Harry Potter" 
     } 
    }); 
    // Return the model for the module 
    return JobModel; 
}); 

Router.js

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'views/jobs/list', 
    'views/jobs/filter' 



], function($, _, Backbone, JobListView, JobListFilterView){ 
    var AppRouter = Backbone.Router.extend({ 
     routes: { 
// Define some URL routes 
      'seeker/jobs': 'showJobs', 
      '*actions': 'defaultAction' 
     }, 
     initialize: function(attr) 
     { 
      Backbone.history.start({pushState: true, root: "/"}) 
     }, 
     showJobs: function() 
     { 
      var view = new JobListView(); 
      view.$el.appendTo('#bbJobList'); 
      view.render(); 
      console.log(view); 


      var jobListFilterView = new JobListFilterView(); 
      jobListFilterView.render() 
     }, 
     defaultAction: function(actions) 
     { 
      console.info('defaultAction Route'); 
      console.log('No route:', actions); 
     } 
    }); 

    var initialize = function(){ 

     console.log('Router Initialized');// <- To e sure yout initialize method is called 

     var app_router = new AppRouter(); 
    }; 
    return { 
     initialize: initialize 
    }; 
}); 

一些例子將是真棒。謝謝

回答

1

提取意味着檢索(如你可能知道),從服務器獲取一些信息。

POST通常用於創建新資源。例如,保存一個新的Job就是一個類似API的REST中的/ jobs URL上的POST。

在你的情況,你可能想要的是:

  • JobCollection這會從骨幹收集擴展和使用JobModel作爲模型
  • JobModel這將代表工作。

您目前已經有JobModel,但它沒有集合...而是您有一個JobFilters集合,這意味着您正在處理多組過濾器。這可能不是你想到的?

假設您現在有一個JobCollection表示您的視圖將顯示的所有作業的列表,那麼當您對其執行collection.fetch()時,它將獲取所有作業,而不使用任何過濾器。

現在的問題變成:我如何傳遞額外的參數來獲取集合中的()?

有很多方法可以做到這一點。當你已經有了一個JobFilterModel,你可以在你的JobFilterModel做的就是實現的方法,如:

//jobCollection being the instance of Job collection you want to refresh 
refreshJobs: function(jobCollection) { 
    jobCollection.fetch({reset: true, data: this.toJSON()}); 
} 

模型的的toJSON將改造模型轉換成漂亮的JavaScript對象。因此,對於你JobFilterModel,的toJSON()將給予回覆是這樣的:

{ 
    T: '1', //Task/Event-based 
    PT: '1', //Part-time 
    C: '1', //Contract 
    I: '1' //Internship 
} 

將它放到收藏的取()選項散列的數據屬性將添加這些到查詢服務器。然後,無論您的服務器回答什麼任務,它們都將用於重置(這就是爲什麼重置:選項中爲true,否則它只是更新)作業集合。然後,您可以在jobCollection「重置」事件的視圖中綁定以知道何時重新呈現。所以,現在,你的JobFilterModel唯一的'作業'是存儲(在內存中)用戶選擇的過濾器,而JobCollection和JobModel不知道任何有關過濾器(他們不應該)。至於存儲JobFilterModel的當前狀態,您可以查看Backbone localstorage插件或將其保存在服務器上/使用模型的fetch()和save()方法從服務器獲取它。

我希望這有助於!

+0

所以我正確地說如果過濾器按鈕被點擊,我打電話給refreshJobs。但在此之前,我需要更新模型中的參數? – TransformBinary

+0

正確,您需要先更新JobFilterModel的實例屬性。例如: jobFilterModel = new JobFilterModel({}); jobFilterModel.set(「T」,2); //只是一個例子 jobFilterModel.refreshCollection(jobCollection); 您可以通過綁定模型更改來自動調用refreshCollection,使其更加「無縫」,但是更難控制何時從您的服務器實際拉動(即修改多個過濾器值時,您只需拉一次.. )。 – Enders