2012-11-21 18 views
32

मैं रीढ़ की हड्डी के साथ एक सुंदर सरल ऐप स्थापित कर रहा हूं, और मुझे एक त्रुटि मिल रही है।"Uncaught TypeError: अपरिभाषित कोई फ़ंक्शन नहीं है" - शुरुआती बैकबोन.जेएस एप्लीकेशन

Uncaught TypeError: undefined is not a function example_app.js:7 
ExampleApp.initialize example_app.js:7 
(anonymous function) 

यह वह जगह है, जहां त्रुटि क्रोम निरीक्षक में दिखाया गया है, (init फ़ाइल - example_app.js):

var ExampleApp = { 
    Models: {}, 
    Collections: {}, 
    Views: {}, 
    Routers: {}, 
    initialize: function() { 
    var tasks = new ExampleApp.Collections.Tasks(data.tasks); 
    new ExampleApp.Routers.Tasks({ tasks: tasks }); 
    Backbone.history.start(); 
    } 
}; 

यहाँ मेरी कार्यों index.haml फ़ाइल के

- content_for :javascript do 
    - javascript_tag do 
    ExampleApp.initialize({ tasks: #{raw @tasks.to_json} }); 

= yield :javascript 

मॉडल/task.js

var Task = Backbone.Model.extend({}); 

कोल lections/tasks.js

var Tasks = Backbone.Collection.extend({ 
    model: Task, 
    url: '/tasks' 
}); 

रूटर/tasks.js

ExampleApp.Routers.Tasks = Backbone.Router.extend({ 
    routes: { 
     "": "index" 
    }, 

    index: function() { 
     alert('test'); 
     // var view = new ExampleApp.Views.TaskIndex({ collection: ExampleApp.tasks }); 
     // $('body').html(view.render().$el); 
    } 
}); 

और यहाँ सबूत है कि मैं फ़ाइलों के सभी फोन कर रहा हूँ है (मुझे लगता है कि):

<script src="/assets/jquery.js?body=1" type="text/javascript"></script> 
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script> 
<script src="/assets/jquery-ui.js?body=1" type="text/javascript"></script> 
<script src="/assets/underscore.js?body=1" type="text/javascript"></script> 
<script src="/assets/backbone.js?body=1" type="text/javascript"></script> 
<script src="/assets/backbone-support/support.js?body=1" type="text/javascript"></script> 
<script src="/assets/backbone-support/composite_view.js?body=1" type="text/javascript"></script> 
<script src="/assets/backbone-support/swapping_router.js?body=1" type="text/javascript"></script> 
<script src="/assets/backbone-support.js?body=1" type="text/javascript"></script> 
<script src="/assets/example_app.js?body=1" type="text/javascript"></script> 
<script src="/assets/easing.js?body=1" type="text/javascript"></script> 
<script src="/assets/modernizr.js?body=1" type="text/javascript"></script> 
<script src="/assets/models/task.js?body=1" type="text/javascript"></script> 
<script src="/assets/collections/tasks.js?body=1" type="text/javascript"></script> 
<script src="/assets/views/task_view.js?body=1" type="text/javascript"></script> 
<script src="/assets/views/tasks.js?body=1" type="text/javascript"></script> 
<script src="/assets/views/tasks_index.js?body=1" type="text/javascript"></script> 
<script src="/assets/routers/tasks.js?body=1" type="text/javascript"></script> 
<script src="/assets/tasks/index.js?body=1" type="text/javascript"></script> 
<script src="/assets/tasks/task.js?body=1" type="text/javascript"></script> 
<script src="/assets/application.js?body=1" type="text/javascript"></script> 

कोई भी विचार बहुत अच्छा होगा। धन्यवाद!

+2

'pears_planner.js' की पंक्ति 12 पर क्या है? आप उस कोड को शामिल नहीं करते हैं, लेकिन त्रुटि संदेश कहता है कि वह समस्या है जहां आप समस्या है। असल में मैं कहूंगा कि इस सवाल के लिए संभवतः एकमात्र प्रासंगिक कोड है। –

+0

क्षमा करें, यह लाइन 7 कहना चाहिए (मुझे एक संस्करण में कुछ टिप्पणियां थीं)। तो यह प्रारंभकर्ता फ़ाइल होगी: 'var functions = new exampleApp.Collections.Tasks (data.tasks); ' – jake

+0

रुको, ताकि त्रुटि गलत हो? चूंकि आपने उस टिप्पणी में जो कोड डाला है, उसमें 'PearsPlanner.initialize' का कोई उल्लेख नहीं है, जहां आपकी त्रुटि आ रही है ... हमें आपकी मदद करने में मदद करें, आदमी ... त्रुटि संदेश पोस्ट करें, और कोड को त्रुटि दें संदेश संदर्भ। –

उत्तर

75

Uncaught TypeError: undefined is not a function example_app.js:7

यह त्रुटि संदेश पूरी कहानी बताता है। इस लाइन पर, आप एक फ़ंक्शन निष्पादित करने का प्रयास कर रहे हैं। हालांकि, जो कुछ भी निष्पादित किया जा रहा है वह एक समारोह नहीं है! इसके बजाए, यह undefined है।

तो example_app.js लाइन 7 पर क्या है? ऐसा लगता है:

var tasks = new ExampleApp.Collections.Tasks(data.tasks); 

उस पंक्ति पर केवल एक ही कार्य चल रहा है। हमें समस्या मिली! ExampleApp.Collections.Tasksundefined है।

तो जहां कि घोषित किया जाता है पर देखो देता है:

var Tasks = Backbone.Collection.extend({ 
    model: Task, 
    url: '/tasks' 
}); 

हैं कि सभी इस संग्रह के लिए कोड है, तो मूल कारण यहीं है। आप ग्लोबल वैरिएबल को कन्स्ट्रक्टर असाइन करते हैं, जिसे Tasks कहा जाता है। लेकिन आप इसे ExampleApp.Collections ऑब्जेक्ट में कभी भी नहीं जोड़ते हैं, एक जगह जिसे आप बाद में उम्मीद करते हैं।

इसे बदलें, और मुझे लगता है कि आप अच्छे होंगे।

ExampleApp.Collections.Tasks = Backbone.Collection.extend({ 
    model: Task, 
    url: '/tasks' 
}); 

देखें कि उचित नाम और रेखा संख्याएं इसे समझने में कितनी महत्वपूर्ण हैं? कभी भी बाइनरी के रूप में त्रुटियों का सम्मान न करें (यह काम करता है या नहीं)। इसके बजाय त्रुटि को पढ़ें, ज्यादातर मामलों में त्रुटि संदेश आपको वास्तविक अंक खोजने के लिए आपको आवश्यक महत्वपूर्ण संकेत देता है।

expression.that('returns').aFunctionObject(); // js 
execute -> expression.that('returns').aFunctionObject // what the JS engine does 

अभिव्यक्ति जटिल हो सकता है यही कारण है कि:


जावास्क्रिप्ट में, जब आप एक समारोह निष्पादित, ऐसा लगता है का मूल्यांकन किया है। तो जब आप undefined is not a function देखते हैं तो इसका अर्थ है कि अभिव्यक्ति फ़ंक्शन ऑब्जेक्ट नहीं लौटाती है। तो आपको यह पता लगाना होगा कि आप निष्पादित करने का प्रयास क्यों कर रहे हैं वह एक फ़ंक्शन नहीं है।

और इस मामले में, ऐसा इसलिए था क्योंकि आपने ऐसा कुछ नहीं किया जहां आपने सोचा था कि आपने किया था।

+31

यदि आप सीखने की कोशिश कर रहे हैं तो कोड को कभी भी कॉपी न करें। पढ़ें और समझने की कोशिश करें कि आप क्या कॉपी करते हैं। यदि आप नहीं जानते कि कुछ क्या है, तो इसे देखो। एक प्रोग्राम को डिबग करना जिसे आप समझ में नहीं आता है, वह एक विंडो के बाहर अपने कीबोर्ड को टॉस करना चाहते हैं। वास्तव में –

+0

। मेरे मामले में, यह $ .noConflict() की एक अंधे प्रतिलिपि के कारण हुआ था। –

संबंधित मुद्दे