100.Day12编写日志列表页

MVVM模式不但可用于Form表单,在复杂的管理页面中也能大显身手。例如,分页显示Blog的功能,我们先把后端代码写出来:

在apis.py中定义一个Page类用于存储分页信息:

class Page(object):

def init(self, item_count, page_index=1, page_size=10):

self.item_count = item_count

self.page_size = page_size

self.page_count = item_count // page_size + (1 if item_count %
page_size > 0 else 0)

if (item_count == 0) or (page_index > self.page_count):

self.offset = 0

self.limit = 0

self.page_index = 1

else:

self.page_index = page_index

self.offset = self.page_size * (page_index - 1)

self.limit = self.page_size

self.has_next = self.page_index < self.page_count

self.has_previous = self.page_index > 1

def str(self):

return ‘item_count: %s, page_count: %s, page_index: %s, page_size:
%s, offset: %s, limit: %s’ % (self.item_count, self.page_count,
self.page_index, self.page_size, self.offset, self.limit)

repr = str

在handlers.py中实现API:

@get(‘/api/blogs’)

def api_blogs(*, page=’1’):

page_index = get_page_index(page)

num = yield from Blog.findNumber(‘count(id)’)

p = Page(num, page_index)

if num == 0:

return dict(page=p, blogs=())

blogs = yield from Blog.findAll(orderBy=’created_at desc’,
limit=(p.offset, p.limit))

return dict(page=p, blogs=blogs)

管理页面:

@get(‘/manage/blogs’)

def manage_blogs(*, page=’1’):

return {

template‘: ‘manage_blogs.html’,

‘page_index’: get_page_index(page)

}

模板页面首先通过API:GET /api/blogs?page=?拿到Model:

{

“page”: {

“has_next”: true,

“page_index”: 1,

“page_count”: 2,

“has_previous”: false,

“item_count”: 12

},

“blogs”: […]

}

然后,通过Vue初始化MVVM:

View的容器是#vm,包含一个table,我们用v-repeat可以把Model的数组blogs直接变成多行的:

新日志

标题 / 摘要 作者 创建时间 操作

往Model的blogs数组中增加一个Blog元素,table就神奇地增加了一行;把blogs数组的某个元素删除,table就神奇地减少了一行。所有复杂的Model-View的映射逻辑全部由MVVM框架完成,我们只需要在HTML中写上v-repeat指令,就什么都不用管了。

可以把v-repeat=”blog:
blogs”看成循环代码,所以,可以在一个内部引用循环变量blog。v-text和v-attr指令分别用于生成文本和DOM节点属性。

完整的Blog列表页如下:

awesomepy-manage-blogs


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!