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列表页如下:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!
目录