前端MVC

前端MVC

简介

做一个留言板,分为留言列表、留言添加的提交表单。数据存储使用cleancloud。

图解

前端MVC图解

前端MVC简述

前端MVC,是一种设计思想,把代码分成视图(View)、数据(Model)、逻辑(Controller)这3个部分。

一般来说,View就是HTML的部分,Model就是从服务器获取到的数据,Controller就是其他逻辑部分。

通过一个留言板功能的例子理解MVC

MVC前

index.html

<section class="message">
    <!-- 留言展示 -->
	<ul class='messageList'></ul>
    <!-- 留言提交 -->
	<form class="postMessageForm">
		用户:<input type="text" name="name">
		内容:<input type="text" name="content">
		<input type="submit" value='提交'>
	</form>
</section>

<!-- 引入leancloud存储服务 -->
<script src="//cdn.jsdelivr.net/npm/leancloud-storage@3.15.0/dist/av-min.js"></script>
<!-- 留言功能模块 -->
<script src="message.js"></script>

message.js

let messageList = document.querySelector('.messageList')
let postMessageForm = document.querySelector('.postMessageForm')

// 初始化leancloud
AV.init({
    appId: "xxxxxx", // 由leancloud提供
    appKey: "xxxxxx", // 由leancloud提供
});
// 读取leancloud
var query = new AV.Query('message');
query.find()
    .then(loadMessage)
// 给留言表单绑定保存留言数据到leancloud的事件
bindEvents()

/* 封装私有函数 */
function bindEvents() {
    postMessageForm.addEventListener('submit', function (eee) {
        eee.preventDefault() // 阻止表单提交默认刷新页面事件
        saveMessage()
    })
}

function loadMessage(message) {
    // 把从leancloud获取的留言,遍历插入到留言列表。
    let array = message.map((item) => item.attributes)
    array.forEach((item) => {
        let li = document.createElement('li')
        li.innerText = `${item.name}:${item.content}`
        messageList.append(li)
    })
}

function saveMessage() {
    let name = postMessageForm.querySelector('input[name=name]').value
    let content = postMessageForm.querySelector('input[name=content]').value
    // leancloud 提供的保存对象的代码
    var Message = AV.Object.extend('message');
    var message = new Message();
    message.set('name', name);
    message.set('content', content);
    message.save()
        .then(
            // 留言成功提交给leancloud后,把这些新增的留言展示在留言列表上。
            function (object) {
                let li = document.createElement('li')
                li.innerText = `${object.attributes.name}:${object.attributes.content}`
                messageList.append(li)
                postMessageForm.querySelector('input[name=content]').value = ''
            }
        )
}

MVC后

message.js

!function () {
    var view = document.querySelector('.message')

    var model = {
        initAV: function () {
            AV.init({
                appId: "xxxxxx", // 由leancloud提供
                appKey: "xxxxxx", // 由leancloud提供
            });
        },
        fetch: function () {
            var query = new AV.Query('message');
            return query.find()
        },
    }

    var controller = {
        view: null,
        model: null,
        init: function (view, model) {
            this.view = view
            this.messageList = view.querySelector('.messageList')
            this.postMessageForm = view.querySelector('.postMessageForm')
            this.model = model
            this.model.initAV()
            this.loadMessage()
            this.bindEvents()
        },
        loadMessage: function () {
            this.model.fetch().then(
                // 把从leancloud获取的留言,遍历插入到留言列表。
                (message) => {
                    let array = message.map((item) => item.attributes)
                    array.forEach((item) => {
                        let li = document.createElement('li')
                        li.innerText = `${item.name}:${item.content}`
                        this.messageList.append(li)
                    })
                }
            )
        },
        bindEvents: function () {
            this.postMessageForm.addEventListener('submit', (eee) => {
                eee.preventDefault() // 阻止表单提交默认刷新页面事件
                this.saveMessage()
            })
        },
        saveMessage: function () {
            let content = this.postMessageForm.querySelector('input[name=content]').value
            let name = this.postMessageForm.querySelector('input[name=name]').value
            // leancloud 提供的保存对象的代码
            var Message = AV.Object.extend('message');
            var message = new Message();
            message.set('name', name);
            message.set('content', content);
            message.save()
                .then(
                    // 留言成功提交给leancloud后,把这些新增的留言展示在留言列表上。
                    function (object) {
                        let li = document.createElement('li')
                        li.innerText = `${object.attributes.name}:${object.attributes.content}`
                        let messageList = document.querySelector('#messageList')
                        messageList.appendChild(li)
                        myForm.querySelector('input[name=content]').value = ''
                    }
                )
        },
    }
    controller.init(view, model)
}.call()