tl; dr:如何在JavaScript中以乾淨的方式實現MVC?JavaScript中的模型 - 視圖 - 控制器
我想在JavaScript中實現MVC。我已經無數次地用我的代碼進行了搜索和重組,但沒有找到合適的解決方案。 (該代碼只是不「感覺正確」。)
下面是我現在正在做的事情。這是非常複雜的,並且是一個痛苦的工作(但仍然比我之前的一堆代碼更好)。它具有醜陋的解決方法,這種方式可以擊敗MVC的目的。
不料,亂七八糟的,如果你真的勇敢:
// Create a "main model"
var main = Model0();
function Model0() {
// Create an associated view and store its methods in "view"
var view = View0();
// Create a submodel and pass it a function
// that will "subviewify" the submodel's view
var model1 = Model1(function (subview) {
view.subviewify(subview);
});
// Return model methods that can be used by
// the controller (the onchange handlers)
return {
'updateModel1': function (newValue) {
model1.update(newValue);
}
};
}
function Model1(makeSubView) {
var info = '';
// Make an associated view and attach the view
// to the parent view using the passed function
var view = View1();
makeSubView(view.__view); // Dirty dirty
// Return model methods that can be used by
// the parent model (and so the controller)
return {
'update': function (newValue) {
info = newValue;
// Notify the view of the new information
view.events.value(info);
}
};
}
function View0() {
var thing = document.getElementById('theDiv');
var input = document.getElementById('theInput');
// This is the "controller", bear with me
input.onchange = function() {
// Ugly, uses a global to contact the model
main.updateModel1(this.value);
};
return {
'events': {},
// Adds a subview to this view.
'subviewify': function (subview) {
thing.appendChild(subview);
}
};
}
// This is a subview.
function View1() {
var element = document.createElement('div');
return {
'events': {
// When the value changes this is
// called so the view can be updated
'value': function (newValue) {
element.innerHTML = newValue;
}
},
// ..Expose the DOM representation of the subview
// so it can be attached to a parent view
'__view': element
};
}
一個人如何在JavaScript中更清潔的方式實現MVC?我該如何改進這個系統?或者這是完全錯誤的路要走,我應該遵循另一種模式?
(四年後)使用AngularJS。 – 2014-04-21 09:45:42
如果您只是想了解MVC如何在Javascript中工作,那麼詢問如何實現它是非常合理的。太多的開發者現在都在使用框架,而沒有真正理解他們的工作方式。 – NobodyReally 2014-08-07 15:38:42