2013-09-04 3 views
1

Я пытаюсь структурировать свой Javascript, используя шаблон модуля.Модульный шаблон с элементами DOM

var appTest = { 

    settings: { 
     date : $(".date") 
    }, 

    init: function() { 
     s = this.settings; 
     this.setDate(); 
    }, 

    setDate: function() { 
     var monthNames = [ "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" ]; 
     var dt = new Date(); 
     s.date.html(dt.getDate()+" "+monthNames[dt.getMonth()]+" "+dt.getFullYear()); 
     //$(".date").html(dt.getDate()+" "+monthNames[dt.getMonth()]+" "+dt.getFullYear()); 
    } 

}; 

$(function(){ 
    appTest.init(); 
}); 

Прямо сейчас элемент dom с классом .date не обновляется с новой датой. Однако, если я раскомментирую прокомментированную строку, она работает нормально.

Я все еще пытаюсь найти свой путь вокруг Javascript.

+0

Вы уверены, что DOM загружен до того, как будет определен appTest? –

+0

Dod вы знаете, 'это' будет изменяться в 's = this.settings'? Вы должны называть его «appTest.init.call (appTest)», чтобы сделать «this' works –

ответ

2

Некоторые проблемы в вашем модуле:

  • использует глобальную переменную, s, без объявления и рисков, связанных с именем столкновения. Вы должны вставить ее
  • вы подвергаете настройкам
  • использовать DOM, прежде чем он будет готов
  • вы звоните setDate на объекте, который не имеет эту функцию

Вы могли бы исправить эти проблемы, как это :

var appTest = (function(){ 
    var monthNames = [ "January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December" ]; 
    var settings = {}; // this is private (not visible from outside the module) 
    var module = {}; 
    module.init = function() { 
     settings.date = $(".date"); 
     module.setDate(); 
    }; 
    module.setDate = function() { 
     var dt = new Date(); 
     settings.date.html(dt.getDate()+" "+monthNames[dt.getMonth()]+" "+dt.getFullYear()); 
    }; 
    return module; 
})(); 

$(function(){ 
    appTest.init(); 
}); 
0

Я бы предложил использовать прототипы. Вы можете сделать синглтон как:

var App = (function AppModule() { 

    function App() { 
    // All your options here 
    this.$date = $('.date'); 
    this.init(); // initialize singleton 
    } 

    App.prototype = { 

    init: function() { 
     this.setDate(); 
    }, 

    setDate: function() { 

     var months = [...] 
     , monthsdate = new Date; 

     this.$date.html(...); 
    } 
    }; 

    return new App; // a singleton 

}()); 
+0

Зачем использовать прототипы для одноэлементного? –

+1

Почему бы не использовать прототипы? Это просто другой подход, ничего отрицательного в этом, что я знаю ... – elclanrs

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