2012-02-19 12 views
17

मैं मॉडल या डोम में कुछ बदलाव किए बिना backbone.js "event" को बढ़ाने का कोई तरीका ढूंढना चाहता हूं।एक बैकबोन.जेएस बढ़ाना घटना देखें

उदाहरण के लिए, मैं फेसबुक एसडीके को असीमित रूप से लोड कर रहा हूं। मैंने auth.login ईवेंट की सदस्यता ली है, और मेरे दृश्य में एक संदेश भेजना चाहता हूं कि उपयोगकर्ता ने लॉग इन किया है ताकि वह स्वयं को उचित रूप से पुनः प्रस्तुत कर सके।

मेरा विचार यह जैसा दिखता है:

window.CreateItemView = Backbone.View.extend({ 
    el: $('#content'), 
    initialize: function() { 
    this.render(); 
    }, 
    render: function() { 
    // do something 
    return this; 
    }, 
    setSignedRequest: function(signedRequest) { 
    //do something with signedRequest 
    } 
}); 

मेरी फेसबुक कोड में, मैं ऐसा करते हैं:

FB.Event.subscribe('auth.login', function(response){ 
    if (response.status === 'connected') { 
     var uid = response.authResponse.userID; 
     var accessToken = response.authResponse.accessToken; 
     window.signedRequest = response.authResponse.signedRequest; 

     if (window.view && window.view.setSignedRequest) { 
      window.view.setSignedRequest(window.signedRequest); 
     } 
    } 
    }); 

हालांकि, जबकि window.view मौजूद है, यह नहीं setSignedRequest विधि देख सकते हैं। मैंने सुनिश्चित किया है कि मेरी स्क्रिप्ट सही क्रम में लोड हो रही हैं। आश्चर्यजनक रूप से मेरे पास एक अलग पृष्ठ पर एक अलग पृष्ठ पर एक ही कोड है, लेकिन यह ठीक काम करता है। मैंने कोई अंतर नहीं देखा है जो इसके लिए जिम्मेदार होगा।

एक बेहतर समाधान कुछ प्रकार की घटनाओं को उठाना होगा और इसके लिए दृश्य सुनना होगा। हालांकि, मैं मॉडल पर परिवर्तन घटना का उपयोग नहीं करना चाहता क्योंकि हस्ताक्षरित Request मॉडल की संपत्ति नहीं होनी चाहिए। क्या इसे पूरा करने का एक बेहतर तरीका है?

+2

ठीक है, '.trigger()' विधि है। आप अपना विचार एक कस्टम इवेंट को सुन सकते हैं, जिसे आप बाद में ट्रिगर करेंगे ... –

उत्तर

28

Backbone.View जिसका मतलब है कि आप आसानी से कस्टम ईवेंट ट्रिगर और जो कुछ डेटा आप चाहते हैं

var View = Backbone.View.extend({ 

    initialize: function() { 

     this.on('customEvent', this.doSomething, this); 
    } 

    doSomething: function(someData) { 

     // this! 
    } 
}); 

var view = new View(); 

view.trigger('customEvent', "someDataHere"); 

पारित कर सकते हैं, हालांकि मैं नहीं जानता कि क्यों तुम दृश्य पर विधि नहीं देख सकते हैं Backbone.Events के साथ बढ़ाया है - यह चाहिए काम - क्या आप 100% सुनिश्चित हैं कि आप दृश्य को तुरंत चालू कर रहे हैं? और window.viewCreateItemView का उदाहरण है?

10

आप ऐसा अपने मॉडल के बाहर और अपने दृश्य पर घटना आप निम्न कर सकता है की सदस्यता के लिए चाहते हैं:

var SomeObject = {...}; 
_.extend(SomeObject, Backbone.Events); 

उसके बाद, आप SomeObject

SomeObject.on('myevent', someFunc, this); 

पर घटनाओं के लिए सदस्यता ले सकते हैं या घटना

SomeObject.trigger('myevent', data); 
संबंधित मुद्दे