0

서로의 이벤트에 응답하고 싶은 뷰를 분리했습니다. 내 application.js 파일에 이벤트 수집기를 추가하고 첫 번째보기에서 내 함수에서 이벤트를 트리거했습니다. 그래도 그 사건에 대한 두 번째 견해를 보일 수는 없습니다. Derrick Bailey의 이벤트 수집기 토론과 documentcloud.github.io 토론을 살펴 보았습니다. 나는 coffeescript와 함께 작동하는 구문을 찾을 수 없었고, 내가 찾은 구문을 어떻게 번역하는지 잘 모르겠습니다. 내가 이벤트를 게시 할Backbone-on-rails 이벤트 수집기

내 첫 번째보기는 다음과 같습니다

class Mlp.Views.PoniesIndex extends Backbone.View 

    poniesTemplate: JST['ponies/index'] 

    events: 
    'submit #new_pony': 'createPony' 
    'click #pony_up': 'ponyUp' 

    initialize: -> 
    console.log(Mlp.Collections.Settings) 
    @collection.on('reset', @render, this) 
    @collection.on('add', @appendPony, this) 
    @collection.on('change', @render, this) 

    ponyUp: (event) -> 
    event.preventDefault() 
    Mlp.vent.trigger('ponyUp', @collection) 
    @collection.ponyDown() 
    @collection.ponyUp() 

내 이벤트 애그리 게이터 (aggregator)는 application.js 파일에 있습니다

//= require jquery 
//= require jquery_ujs 
//= require underscore 
//= require backbone 
//= require mlp 
//= require_tree ../templates 
//= require_tree ./models 
//= require_tree ./collections 
//= require_tree ./views 
//= require_tree ./routers 
//= require_tree . 

Mlp.vent = _.extend({}, Backbone.Events); 

내 응용 프로그램이 추가 할 때 의 .js 파일 나는 콘솔 로그를 원하는 얻을 :

Mlp.vent.bind("ponyUp", function(collection){ 
console.log("pony up!"); 
}); 

을하지만 난에 이벤트 바인더를 추가 할 때

class Mlp.Views.SettingsIndex extends Backbone.View 

    template: JST['settings/index'] 

    events: 
    'submit #new_setting': 'createSetting' 
    'click #change_of_venue': 'randomSetting' 

    initialize: -> 
    @collection.on('ponyUp', @alterbox, this) 
    @collection.on('reset', @render, this) 
    @collection.on('add', @appendSetting, this) 
    @collection.on('change', @render, this) 

    alertbox: (collection) -> 
    event.preventDefault() 
    console.log("pony up!") 

내가 시도 diffent 구문의 다양한하지만 난 여전히 내가하는 초기화에서 컬렉션에 바인딩하거나 이벤트에 바인딩해야하는지 확실하지 않다 : 나는 아무것도 얻을 게시 된 이벤트를 수신 할보기 선언. 내가 본 예제에서는 밑줄의 _.bindAll을 사용합니다. 내가 그것을 시도했을 때 "undefined"의 bind를 읽을 수 없다. 내 application.js에서 밑줄이 필요하다. 이것이 내가 이해하지 못하는 몇 가지 기본 구문이라고 확신합니다.

도움을 주셔서 감사합니다.

답변

0

컬렉션에서 'ponyUp' 이벤트를 보내지 않으면 이벤트 수집기 (Mlp.vent)가 전송됩니다. 당신이 말할 때 :

Mlp.vent.trigger('ponyUp', @collection) 

당신은 Mlp.vent을 요구하고는 인수로 @collection'ponyUp' 이벤트를 보내, 당신은 @collection에서 'ponyUp' 이벤트를 트리거 아닙니다.

@collection.on('ponyUp', @alterbox, this) 

더 다음과 같아야합니다 :

Mlp.vent.on('ponyUp', @alterbox, this) 

다른 방법으로, 손으로 컬렉션의 이벤트를 트리거 할 수있는 당신이 이벤트에 대한 Mlp.vent이 듣고 싶어한다는 것을 의미 이런 일이 :

@collection.trigger('ponyUp', @collection) 

두 가지 방법의 주요 차이점은 Mlp.vent를 사용하는 사람이 이벤트 전자를 수신 할 수 있다는 것입니다 만약 그들이 컬렉션을 가지고 있지 않다면 @collection.trigger 접근법은 모든 사람들이 이벤트를 청취하기 전에 컬렉션에 대한 참조를 필요로합니다.

+0

그 중 하나였습니다! 완전히 새로운 세상입니다. – DizzyDez