2012-12-28 23 views
0

更新:問題已解決,案例已關閉。BackboneJS + RequireJS允許視圖使用全局事件分派器對集合進行操作


我仍然有問題讓我的代碼的一部分工作。

我的看法,現在聽來收集更新,什麼應該發生的是:

  • 的ListView監聽結果集
  • 結果同步
  • ListView控件創建爲每個結果
  • 的ItemView控件ListView控件(UL)各追加ItemView控件(LI)

一切似乎都做工精細,直到最後一步。

ListView中的作用是應該添加的結果列表不能訪問到ListView的元素。

我可以創建一個ItemView,並檢索它的元素「<li>」,但ListView的「<ul>」不能在函數內引用。

從樣品的ListView碼位:

el: $('.result-list'), 

initialize: function() { 
    this.listenTo(this.collection, 'add', this.addOne); 
}, 

addOne: function(result) { 
    view = new ItemView({ model: result }); 
    this.$el.append(view.render().el); 
}, 

在上面的代碼中,變量視圖存在一樣,它的元件,但「這」不是指到ListView了。下面


問題解決

我試圖完成是有一個查看模塊(搜索)能夠在集合(結果)觸發事件。

當搜索查看提交,就應該輸入字段傳遞到收集的提取方法來從服務器檢索結果。目前,我可以從View中觸發一個函數,但該函數無法訪問任何Collection的方法。

以前,我讓View/Collection直接通過它們的變量名來引用對方。
由於我已將代碼分離爲模塊,View/Collection無法直接訪問對方。

下面是一些代碼:(寫成的CoffeeScript)

app.coffee - global_dispatcher應用於骨幹

define [ 
    'jquery' 
    'underscore' 
    'backbone' 
    'cs!router' 
], ($, _, Backbone, Router) -> 
    # global_dispatcher added to all Backbone Collection, Model, View and Router classes 
    dispatcher = _.extend {}, Backbone.Events, cid: 'dispatcher' 
    _.each [ Backbone.Collection::, Backbone.Model::, Backbone.View::, Backbone.Router:: ], (proto) -> 
     _.extend proto, global_dispatcher: dispatcher 

    new Router() 

router.coffee - 這是我遇到麻煩。 'getResults'的功能被觸發,但是集合'results'無法從這裏訪問。

define [ 
    'backbone' 
    'cs!views/resuls/list' 
    'cs!views/results/search' 
    'cs!collections/results' 
], (Backbone, ListView, SearchView, Results) -> 
    Backbone.Router.extend 
     routes: 
      # URL routes 
      '': 'index' 

     index: -> 
      results = new Results 
      new ListView { model: results } 
      new SearchView 

      @global_dispatcher.bind 'getResults', (data) -> 
       console.log results 

搜索。咖啡 - 查看哪個觸發事件,它會成功觸發事件並傳遞正確的參數。

define [ 
    'jquery' 
    'backbone' 
], ($, Backbone) -> 
    Backbone.View.extend 
     events: 
      'submit #search-form': 'submit' 

     submit: (evt) -> 
      evt.preventDefault() 

      phrase = @.$('input').val() 
      @.$('input').val('') 

      args = name: phrase 

      @global_dispatcher.trigger 'getResults', args 
+0

東西我忘了提。我期望讓代碼完成我需要的行爲(查看觸發器collection.fetch),但不一定如上所述。 如果有比這更好的方法,我寧願改變任何必要的,以便我可以正確地做到這一點。 –

+0

你想用這個'@ global_dispatcher'解決什麼問題?我問,因爲我已經編寫了一年多的Backbone應用程序,並且從來沒有這樣的需求(並且似乎解決您的問題的最簡單的解決方案是解決您在沒有全局調度程序時遇到的任何核心問題,並且完全擺脫它)。 – machineghost

+0

我希望搜索視圖能夠從服務器獲取集合的獲取結果。我的問題是這樣做的,而模型,集合和視圖分解成模塊。 –

回答

0

如果我正確理解您的問題,這不難解決。下面是一些僞代碼來說明:

var Results = Backbone.Collection.extend(); 
var Search = Backbone.View.extend({ 
    someEventHandler: function() { 
     // The next line accesses the collection from the view 
     this.collection.fetch(); 
    } 
}); 
var results = new Results(); 
var search = new Search({collection: results}); 

如果你希望你的觀點做一些事情,結果回來後,只要綁定的集合的事件處理程序:

var Search = Backbone.View.extend({ 
    fetchResposne: function() { /* do something*/}, 
    someEventHandler: function() { 
     // The next line accesses the collection from the view 
     this.collection.on('sync', this.fetchResponse); 
     this.collection.fetch(); 
    } 
}); 
+0

哇,我讓這個問題的方式比它需要的更復雜。謝謝! 我將我的代碼轉換爲Require.js並嘗試將所有內容組織到單獨的模塊中。一旦所有東西都分開了,我就會對如何讓所有東西都重新工作感到困惑。甚至沒有想到將這些藏品傳達給觀點,現在我正在拍我的額頭。 –

+0

謝謝你回答我的問題!您的解決方案解決了讓View和Collection一起工作的問題。我的代碼的一部分仍然沒有工作,你認爲你可以看看我做的編輯嗎? –

+0

你非常歡迎,但是Stack Overflow禮節的一個快速點:你應該總是將SO帖子/問題限制在一個單獨的(儘可能具體)問題。換句話說,用多個問題「超載」一個問題是一個不行的;你最好創建一個新問題。這就是說,我正在起飛,如果你問這個問題,我不會回答這個新問題,所以簡短的回答是:你需要了解''這個''在Javascript中的工作方式更好。更簡短的答案是,如果你將這段代碼添加到視圖的初始化中,它應該修正一些事情:'_(this).bindAll('addOne');'。 – machineghost

相關問題