2015-07-04 165 views
-2

我試圖完成模式的任務,但它不起作用。我需要通過這個任務,這裏是我得到的,任務如下。如果有人能幫助我,我將不勝感激。MVC JavaScript模式

window.onload = function() { 
 

 
//--------MODEL--------------- 
 
//* 
 
function Model(option) { 
 
\t this.name = option.name; 
 
\t this.age = option.age; 
 
\t this.year = option.year; 
 
\t this.examsTaken = option.examsTaken; 
 
}; 
 

 
Model.prototype = { 
 
\t constructor: Model, 
 
\t takeExam:function(){ 
 
\t \t this.examsTaken++; 
 
\t \t this.changed = true; 
 
\t } 
 
} 
 

 
// -----CONTROLLER ------------- 
 
//* 
 
function Controller(action){ 
 
\t this.model = action.model; 
 
\t this.elementId = action.elementId; 
 

 
}; 
 

 
Controller.prototype = { 
 
\t constructor: Controller, 
 
\t render: function(){ 
 
\t \t return '<span>' + this.model.name + '</span><button id="student-exams-button">Increase exams taken</button>'; 
 
\t }, 
 
\t clickHandlers: { 
 
\t \t '#student-exams-button': 'updateExams' 
 
\t }, 
 
\t updateExams: function(){ 
 
\t \t this.model.takeExam(); 
 
\t } 
 
}; 
 

 
//--------VIEW------------ 
 
function View() { 
 
\t document.getElementById(StudentController.elementId).innerHTML = StudentController.render(); 
 

 
} 
 
//---INFORMATION --- 
 

 
var Student = new Model({ 
 
\t name: 'Piotr', 
 
\t age: 22, 
 
\t year: 5, 
 
\t examsTaken: 2, 
 
}); 
 

 
var StudentController = new Controller({ 
 
\t model: Student, 
 
\t elementId: 'student-container' 
 
}); 
 

 
View(); 
 

 
//test 
 
console.log(StudentController.render()); 
 
Student.takeExam(); 
 
StudentController.updateExams() 
 
console.log(Student.examsTaken); 
 
StudentController.updateExams() 
 
console.log(Student.examsTaken); 
 

 

 
    }

,任務...

落實執行實體模型和控制器/演示模式MVC/MVP。視圖以html的形式呈現。 模型保留數據和處理方法,Controller - 處理來自用戶的事件並呈現視圖。 因此,如下面的代碼的結果,應該按預期工作:

var Student = new Model({ 
 
    name: 'Piotr', 
 
    age: 22, 
 
    year: 5, 
 
    examsTaken: 2, 
 
    takeExam: function(){ 
 
     this.examsTaken++; 
 
     this.changed = true; 
 
    } 
 
}); 
 
var StudentController = new Controller({ 
 
    model: Student, 
 
    elementId: 'student-container', 
 
    render: function(){ 
 
     return '<span>' + this.model.name + '</span><button id="student-exams-button">Increase exams taken</button>'; 
 
    }, 
 
    clickHandlers: { 
 
     '#student-exams-button': 'updateExams' 
 
    }, 
 
    updateExams: function(){ 
 
     this.model.takeExam(); 
 
    } 
 
});

因此,模型不具有任何特殊的邏輯本質上是一個單純的對象。控制器還會將結果插入呈現器 功能找到的元素,其id爲屬性elementId。渲染器在Controller中被調用。還有必要實現Controller的方法的實質,它將每隔100ms檢查一次this.model.changed,如果爲true,則調用render方法, 已更改並返回false。 (這是一個非常可惡的做法,但對你理解下一步會發生什麼很有用)對象的值 是方法clickHandlers控制器,當用戶點擊元素鍵到當前值時將調用該控制器

+1

這看起來像你的家庭作業的一個很好的書面記錄,但_「這不作品」 _不是你的問題的一個很好的書面記錄......在哪裏具體是你卡住了嗎?我們不會在StackOverlflow上爲您做功課,但是我們會幫助您回答一個特定的問題,讓您堅持做自己的功課。 –

+0

這看起來像你的整個任務,我們不會爲你解決這個問題。畢竟,它存在以至於你應該學習。如果您遇到MVC問題,請閱讀它。如果您遇到特定問題,請發佈該問題。 – Jan

回答

0

我做到了,所以也許有人會需要回答

function Model(obj) { 
     for (var key in obj) { 
       this[key] = obj[key]; 
     } 
} 

function Controller(obj) { 
     for (var key in obj) { 
       this[key] = obj[key]; 
     } 

     document.getElementById(this.elemetId).innerHTML = this.render(); 
     this.setHandlers(); 
     this.checkModelChanges(); 
} 

    Controller.prototype.setHandlers = function() { 
     var that = this; 

     document.getElementById(that.elemetId).onclick = function (e) { 
       var id = '#' + e.srcElement.getAttribute('id'), 
         handler = that.clickHandlers[id]; 
       if (handler) { 
         that[handler].call(that); 
       } 
     }; 
}; 

Controller.prototype.checkModelChanges = function() { 
     var that = this; 

     setInterval(function() { 
       if (that.model.changed) { 
         document.getElementById(that.elemetId).innerHTML = that.render(); 
         that.model.changed = false; 
       } 
     }, 100); 
};