2013-04-15 5 views
0

вот мой кодпервого раз переменная реализации модуля шаблон не определен

var s; 
var AddEvent = { 
    settings : { 
     saveButton : $('#uploadfiles1'), 
     cancelSpeech : $('.cancelSpeech'), 
     datePicker : $(".datepicker"), 
     eventName : $('input[name=eventname]'), 
     eventDate : $('input[name=eventdate]') 
    }, 
    init:function(s){ 
     s = this.settings; 
     this.BindEvents(); 
     $('.Wallpapers').addClass('active'); 
     $('input, textarea').placeholder(); 
    }, 
    BindEvents:function(){ 
     this.CancelButton(); 
     this.DatePicker(); 
     // this.SaveButton(); 
     $('input[type=text],textarea').on('keyup change',function(){ 
      AddEvent.FieldsCheck(); 
     }); 
    }, 
    CancelButton: function() 
    { 
     s.cancelSpeech.on('click',function(){ 
      var referrer = document.referrer; 
      window.location = referrer; 
     }); 
    }, 
    DatePicker :function() 
    { 
     s.datePicker.datepicker({ 
      //defaultDate: +7, 
      showOtherMonths: true, 
      autoSize: true, 
      //appendText: '(dd-mm-yyyy)', 
      dateFormat: 'dd/mm/yy' 
     }); 
    }, 
    SaveButton: function() 
    { 
     this.ClearFields(); 
    }, 
    FieldsCheck: function() 
    { 
     alert(s.eventName.attr('name')); 
     if(s.eventName.val()!='' && s.eventDate.val() !='' && $('textarea').val()!='') 
     { 
      s.saveButton.removeAttr('disabled').removeClass('disabled'); 
     } 
     else 
      s.saveButton.attr('disabled','disabled').addClass('disabled'); 
    }, 
    ClearFields:function() 
    { 
     $('input,textarea').val(''); 
     this.FieldsCheck(); 
    } 
}; 
$(function(){ 
    AddEvent.init(s); 
}); 

я impletenting этого примера http://css-tricks.com/how-do-you-structure-javascript-the-module-pattern-edition/

, но каждый раз, когда я тип в моем поле ввода на этой линии я получаю неопределенный в боевой готовности

alert(s.eventName.attr('name')); 

скажите, пожалуйста, что я делаю неправильно, я попытался найти, но не смог найти ничего полезного.

редактировать: здесь я создал небольшой jsfiddle я получаю

TypeError: this.settings is undefined 
[Break On This Error] 

console.log(this.settings.eventName.attr('id')); 

благодаря

+0

Почему aere вы используете 's' вообще? У вас уже есть 'this.settings' в области. Если вы хотите сократить его для ввода, определите его как локальную переменную * внутри *, а не глобально. – David

+0

this.settings также дать мне неопределенную ошибку :( –

ответ

2

Ваша проблема здесь:

var s; 
AddEvent.init(s); 

Там нет никакого способа, после этого иметь s определены.

Решение было бы просто не пройти s (и не объявят его в аргументах функции):

init:function(s){ 
    s = this.settings; 
... 
AddEvent.init(); 

Но что позволяет переменное загрязняющий глобальное пространство имен.

Если вы хотите, чтобы ваши settings быть доступны из всех функций, вы можете вставлять в в затворе:

var AddEvent = (function(){ 
    var settings; 
    return { 
     init:function(){ 
       settings = { 
         saveButton : $('#uploadfiles1'), 
         cancelSpeech : $('.cancelSpeech'), 
         datePicker : $(".datepicker"), 
         eventName : $('input[name=eventname]'), 
         eventDate : $('input[name=eventdate]') 
       }; 
      this.BindEvents(); 
      $('.Wallpapers').addClass('active'); 
      $('input, textarea').placeholder(); 
     }, 
     BindEvents:function(){ 
      this.CancelButton(); 
      this.DatePicker(); 
      // this.SaveButton(); 
      $('input[type=text],textarea').on('keyup change',function(){ 
       AddEvent.FieldsCheck(); 
      }); 
     }, 
     CancelButton: function() 
     { 
      settings.cancelSpeech.on('click',function(){ 
       var referrer = document.referrer; 
       window.location = referrer; 
      }); 
     }, 
     DatePicker :function() 
     { 
      settings.datePicker.datepicker({ 
       //defaultDate: +7, 
       showOtherMonths: true, 
       autoSize: true, 
       //appendText: '(dd-mm-yyyy)', 
       dateFormat: 'dd/mm/yy' 
      }); 
     }, 
     SaveButton: function() 
     { 
      this.ClearFields(); 
     }, 
     FieldsCheck: function() 
     { 
      alert(settings.eventName.attr('name')); 
      if(settings.eventName.val()!='' && settings.eventDate.val() !='' && $('textarea').val()!='') 
      { 
       settings.saveButton.removeAttr('disabled').removeClass('disabled'); 
      } 
      else 
       settings.saveButton.attr('disabled','disabled').addClass('disabled'); 
     }, 
     ClearFields:function() 
     { 
      $('input,textarea').val(''); 
      this.FieldsCheck(); 
     } 
    } 
})(); 

$(function(){ 
    AddEvent.init(); 
}); 
+0

теперь, когда я страница загрузки появляется сообщение об ошибке TypeError: s неопределен [Перерыв на этой ошибке] \t s.cancelSpeech.on («нажмите», function() { –

+0

Я отредактировал. Вам лучше использовать шаблон фабрики. –

+0

Я пробовал этот шаблон, также это также дало мне неопределенное предупреждение, но теперь я скопировал весь код, который вы отправили, и все еще получаю неопределенную ошибку на –

 Смежные вопросы

  • Нет связанных вопросов^_^