【发布时间】:2019-04-30 14:55:02
【问题描述】:
我有一个视图可以更改样式并显示/隐藏元素以响应用户操作。如何将视图返回到其默认状态?
例如:
class Model {
constructor() {}
}
class Controller {
constructor(model) {
this.model = model;
}
respondToButton() {
$('#context-box').css('color', 'red');
alert("Cannot do baz.");
}
respondToSelect(e) {
if ($(e.target).val() == "foo") {
$('#context-area').hide();
} else {
$('#context-area').show();
}
}
}
class View {
constructor(controller) {
this.controller = controller;
this.bindEvents();
}
bindEvents() {
$('#button').on('click', this.controller.respondToButton);
$('#select').on('change', this.controller.respondToSelect);
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.min.js"></script>
<html>
<head></head>
<body>
<select id="select">
<option value="foo">Foo</option>
<option value="bar">Bar</option>
</select>
<div hidden id="context-area">
<span id="context-box">Baz</span>
<button id="button">Do Baz?</button>
</div>
</body>
<script>
$(document).ready(function() {
var model = new Model();
var controller = new Controller(model);
var view = new View(controller);
});
</script>
</html>
一旦 context-box 被修改,即使外部上下文发生变化,它也会保持这种状态。我希望它恢复到原来的“加载”状态。
一种选择是只重新加载页面,但重新加载页面以响应选择更改感觉不是很好,可能需要“您确定吗?”卸载事件。
对于这个小例子,我可以在选择更改事件中重置 css,但是随着 context-area 变得更加复杂,要重置的元素数量会增加。这也让未来的更改令人沮丧,因为每次更改都需要相应的重置。
我目前使用的选项是在页面加载时克隆 context-area,然后删除和恢复节点以响应上下文变化。这工作正常,但我发现自己删除和恢复节点以响应每个模型更改,以防万一。
有没有更好的方法来处理这个问题?这在 MVC 框架中是如何完成的(我还没学过)?
【问题讨论】:
-
您的示例中的哪个事件需要重置状态?
-
respondToSelect()
标签: javascript model-view-controller