精华内容
下载资源
问答
  • 分页器

    2018-11-26 21:16:00
    1.分页器 作用:干啥?数据量大话,可以分页获取,查看。 2.一次性插入多条数据 def add1(request): # 这样for循环会造成对数据库大量访问,不建议这样添加 # models.Book.objects.create(name='...

    1.分页器

    作用:干啥的?数据量大的话,可以分页获取,查看。

    2.一次性插入多条数据

    def add1(request):
        # 这样for循环会造成对数据库的大量访问,不建议这样添加
        # models.Book.objects.create(name='连城诀%s'%i,price=10+i)
        ll=[]
        for i in range(100):
            ll.append(models.Book(name='连城诀%s' %i,price=10+i))
        #批量插入,两个参数,第一个是对象列表,第二个是一次插入的数据量,不填,默认一次全插入
        models.Book.objects.bulk_create(ll)
        return HttpResponse('OJ8K')
    View Code

    在这里注意要使用批量插入,减少访问mysql数据库的次数

    3.分页器代码

    book_list = models.Book.objects.get_queryset().order_by('id')#当分页提示报警时,可以order by id一下

    前端代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <script src="/static/jquery-3.3.1.js"></script>
        {% load static %}
        <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
        <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.css' %}">
        <link rel="stylesheet" href="{% get_static_prefix %}bootstrap-3.3.7-dist/css/bootstrap.css">
        <title>Title</title>
    </head>
    <body>
    <div class="col-md-6 col-md-offset-3">
        <div class="row">
            <table class="table table-bordered">
                <thead>
                <tr>
                    <td>书名</td>
                    <td>价格</td>
                </tr>
                </thead>
                <tbody>
                {% for book in current_page %}
                    <tr>
                        <td>{{ book.name }}</td>
                        <td>{{ book.price }}</td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
        <nav aria-label="Page navigation">
            <ul class="pagination">
                {% if current_page.has_previous %}
                    <li>
                        <a href="/booklist/?page={{ current_page.previous_page_number }}" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Previous">
                            <span aria-hidden="true">上一页</span>
                        </a>
                    </li>
                {% endif %}
                {% for foo in page_range %}
                    {% if current_page_num ==  foo %}
                        <li class="active"><a href="/booklist/?page={{ foo }}">{{ foo }}</a></li>
                    {% else %}
                        <li><a href="/booklist/?page={{ foo }}">{{ foo }}</a></li>
                    {% endif %}
                {% endfor %}
                {% if current_page.has_next %}
                    <li>
                        <a href="/booklist/?page={{ current_page_num|add:1 }}" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% else %}
                    <li class="disabled">
                        <a href="" aria-label="Next">
                            <span aria-hidden="true">下一页</span>
                        </a>
                    </li>
                {% endif %}
            </ul>
        </nav>
    </div>
    
    </body>
    </html>
    View Code

    后台代码

    from django.shortcuts import render, HttpResponse, reverse, redirect
    from app01 import models
    from django.http import JsonResponse
    from django.core.paginator import Paginator, EmptyPage
    
    
    # Create your views here.
    def index(request):
        return render(request, 'index.html')
    
    
    def login(request):
        dic = {'status': 100, 'msg': None}
        name = request.POST.get('name')
        password = request.POST.get('password')
        user = models.User.objects.filter(name=name, password=password)
        print(request.POST)
        if user:
            dic['msg'] = '登录成功'
            return JsonResponse(dic)
        else:
            dic['status'] = 101
            dic['msg'] = '用户名或密码错误'
            return JsonResponse(dic)
    
    
    def add1(request):
        # 这样for循环会造成对数据库的大量访问,不建议这样添加
        # models.Book.objects.create(name='连城诀%s'%i,price=10+i)
        ll = []
        for i in range(100):
            ll.append(models.Book(name='连城诀%s' % i, price=10 + i))
        # 批量插入,两个参数,第一个是对象列表,第二个是一次插入的数据量,不填,默认一次全插入
        models.Book.objects.bulk_create(ll)
        return HttpResponse('OJ8K')
    
    
    # def booklist(request):
    #     if request.method=='GET':
    #         #查询所有图书
    #         books=models.Book.objects.all()
    #         from django.core.paginator import Paginator#导入分页器
    #         #分页器,类。要实例化产生对象,要传两个参数:object_list:对象列表,per_page:每页显示的条数
    #         paginator=Paginator(books,10)
    #         # print(paginator.count)#打印总条数
    #         # print(paginator.num_pages)#打印总页数
    #         # print(paginator.page_range)#页码数的列表
    #         current_page=paginator.page(5)#取到第x页,返回一个Page对象
    #         print(current_page.object_list)#取当前页码所有数据
    #         print(current_page.has_next())#是否有下一页
    #         print(current_page.has_previous())#是否有上一页
    #         print(current_page.next_page_number())#下一页页码数
    #         print(current_page.previous_page_number())#上一页页码数
    #         return render(request,'booklist.html',locals())
    
    # def booklist(request):
    #     from django.core.paginator import Paginator
    #     books=models.Book.objects.all()
    #     paginator=Paginator(books,3)
    #     try:
    #         current_page_num=int(request.GET.get('page'))
    #         current_page=paginator.page(current_page_num)
    #         # for item in current_page:#既可以循环current_page,又可以循环当前页的对象current_page.object_list
    #         #     print(item)#拿到前端去用
    #     except EmptyPage as e:
    #         #捕获异常后调到第一页
    #         current_page_num=1
    #         current_page=paginator.page(current_page_num)
    #     except Exception as e:
    #         current_page_num = 1
    #         current_page = paginator.page(current_page_num)
    #     return render(request,'booklist.html',locals())
    def booklist(request):
        book_list = models.Book.objects.get_queryset().order_by('id')#当分页提示报警时,可以order by id一下
        paginator = Paginator(book_list, 3)
        # 如果页码数多,让它显示前5,后5,中间是当前在的页
        try:
            current_page_num = int(request.GET.get('page'))
            current_page = paginator.page(current_page_num)
            if paginator.num_pages > 11:
                if current_page_num - 5 < 1:
                    page_range = range(1, 12)
                elif current_page_num + 5 > paginator.num_pages:
                    page_range = range(paginator.num_pages - 11, paginator.num_pages)
                else:
                    page_range = range(current_page_num - 5, current_page_num + 5)
            else:
                page_range = paginator.page_range
        except Exception as e:
            current_page_num = 1
            current_page = paginator.page(current_page_num)
        return render(request, 'booklist.html', locals())
    View Code

     range是前闭后开区间,range(1,11)表示[0,11)之间的所有整数.注意分页要分成一个range区间,range别忘记写上

    page_range=range(1,current_page_num+5)

    注意request获取到的页码是字符串,要转成int类型

    current_page_num = request.GET.get('page')
    current_page_num=int(current_page_num)

     4.bootstrap样式

    class="disabled"元素一律点击无效

    转载于:https://www.cnblogs.com/xufengnian/p/10022988.html

    展开全文
  • 分页瓦片卸载是在Rex引擎setMap函数中创建,创建之初就关联了活跃瓦片寄存器和资源释放作用见下面分析。 osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp void RexTerrainEngineNode::setMap...

    目标:(十二)中的问题22

    分页瓦片卸载器是在Rex引擎的setMap函数中创建的,创建之初就关联了活跃瓦片寄存器和资源释放器。作用见下面分析。

    osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
    void
    RexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options)
    {  
        // Make a tile unloader
        _unloader = new UnloaderGroup( _liveTiles.get() );
        _unloader->setThreshold( _terrainOptions.expirationThreshold().get() );
        _unloader->setReleaser(_releaser.get());
        this->addChild( _unloader.get() );
    }

    1、渲染遍历时在RexTerrainEngineNode裁剪遍历阶段向卸载器中添加要删除的瓦片节点,如何确定要删除的瓦片节点 由RexTerrainEngineNode的上下文环境中的endCull函数中的扫描器来确定(endCull最终是在RexTerrainEngineNode在渲染遍历时调用):

    osgEarthDrivers/engine_rex/EngineContext.cpp
    void
    EngineContext::endCull(osgUtil::CullVisitor* cv)
    {
        std::vector<TileKey> tilesWithChildrenToUnload;
        Scanner scanner(tilesWithChildrenToUnload, cv->getFrameStamp());
        _liveTiles->run( scanner );
        if ( !tilesWithChildrenToUnload.empty() )
        {        
            getUnloader()->unloadChildren( tilesWithChildrenToUnload );
        }
    }
    osgEarthDrivers/engine_rex/TileNodeRegistry.cpp
    void
    TileNodeRegistry::run( const TileNodeRegistry::ConstOperation& op ) const
    {
        Threading::ScopedReadLock lock( _tilesMutex );
        op.operator()( _tiles );
        OE_TEST << LC << _name << ": tiles=" << _tiles.size() << std::endl;
    }

    扫描器的扫描过程如下:

    osgEarthDrivers/engine_rex/EngineContext.cpp
            enum Policy {
                POLICY_FIND_ALL,
                POLICY_FIND_SOME,
                POLICY_FIND_ONE
            };
            void operator()(const TileNodeRegistry::TileNodeMap& tiles) const
            {
                if ( tiles.empty() ) return;
                unsigned f = _stamp->getFrameNumber(), s = tiles.size();
    
                switch (_policy)
                {
                    case POLICY_FIND_ALL:
                    {
                        for (TileNodeRegistry::TileNodeMap::const_iterator i = tiles.begin(); i != tiles.end(); ++i)
                        {
                            const TileNode* tile = i->second.tile.get();
                            if (tile->areSubTilesDormant(_stamp))
                                _keys.push_back(i->first);
                        }
                    }
                    break;
    
                    case POLICY_FIND_ONE:
                    {
                        const TileNode* tile = tiles.at(f%s);
                        if (tile->areSubTilesDormant(_stamp))
                        {
                            _keys.push_back(tile->getKey());
                        }
                    }
                    break;
    
                    default:
                    case POLICY_FIND_SOME:
                    {
                        for(unsigned i=0; i<4; ++i) {
                            const TileNode* tile = tiles.at((f+i)%s);
                            if ( tile->areSubTilesDormant(_stamp) )
                                _keys.push_back( tile->getKey() );
                        }
                    }
                }
            }

    扫描策略默认为POLICY_FIND_ALL,扫描的对象即为活跃瓦片寄存器。对于活跃瓦片寄存器中的每一个瓦片,判断其子瓦片是否处于休眠状态Dormant,也即判断最近一次遍历时的帧号和时间与当前做比较,如果超出一定阈值则认为时休眠状态。

    osgEarthDrivers/engine_rex/TileNode.cpp
    bool
    TileNode::areSubTilesDormant(const osg::FrameStamp* fs) const
    {
        return
            getNumChildren() >= 4           &&
            getSubTile(0)->isDormant( fs )  &&
            getSubTile(1)->isDormant( fs )  &&
            getSubTile(2)->isDormant( fs )  &&
            getSubTile(3)->isDormant( fs );
    }
    
    bool
    TileNode::isDormant(const osg::FrameStamp* fs) const
    {
        const unsigned minMinExpiryFrames = 3u;
    
        bool dormant = 
               fs &&
               fs->getFrameNumber() - _lastTraversalFrame > std::max(_minExpiryFrames, minMinExpiryFrames) &&
               fs->getReferenceTime() - _lastTraversalTime > _minExpiryTime;
        return dormant;
    }

    那么最近一次遍历的帧号和时间是怎么设置呢(在渲染遍历里),怎么就不会再渲染遍历该瓦片节点了(是不是会根据瓦片距离或像素等因为来判断,应该是上部有限定条件)

    osgEarthDrivers/engine_rex/TileNode.cpp
    bool
    TileNode::accept_cull(TerrainCuller* culler)
    {
        bool visible = false;
        
        if (culler)
        {
            // update the timestamp so this tile doesn't become dormant.
            _lastTraversalFrame.exchange( culler->getFrameStamp()->getFrameNumber() );
            _lastTraversalTime = culler->getFrameStamp()->getReferenceTime();
    
            if ( !culler->isCulled(*this) )
            {
                visible = cull( culler );
            }
        }
    
        return visible;
    }

    2、卸载器更新遍历时从活跃瓦片寄存器中删除瓦片节点

    osgEarthDrivers/engine_rex/Unloader.cpp
    void
    UnloaderGroup::traverse(osg::NodeVisitor& nv)
    {
        if ( nv.getVisitorType() == nv.UPDATE_VISITOR )
        {        
            if ( _parentKeys.size() > _threshold )
            {
                ScopedMetric m("Unloader expire");
    
                unsigned unloaded=0, notFound=0, notDormant=0;
                Threading::ScopedMutexLock lock( _mutex );
                for(std::set<TileKey>::const_iterator parentKey = _parentKeys.begin(); parentKey != _parentKeys.end(); ++parentKey)
                {
                    osg::ref_ptr<TileNode> parentNode;
                    if ( _tiles->get(*parentKey, parentNode) )
                    {
                        // re-check for dormancy in case something has changed
                        if ( parentNode->areSubTilesDormant(nv.getFrameStamp()) )
                        {
                            // find and move all tiles to be unloaded to the dead pile.
                            ExpirationCollector collector( _tiles );
                            for(unsigned i=0; i<parentNode->getNumChildren(); ++i)
                                parentNode->getSubTile(i)->accept( collector );
                            unloaded += collector._count;
    
                            // submit all collected nodes for GL resource release:
                            if (!collector._nodes.empty() && _releaser.valid())
                                _releaser->push(collector._nodes);
    
                            parentNode->removeSubTiles();
                        }
                        else notDormant++;
                    }
                    else notFound++;
                }
    
                OE_DEBUG << LC << "Total=" << _parentKeys.size() << "; threshold=" << _threshold << "; unloaded=" << unloaded << "; notDormant=" << notDormant << "; notFound=" << notFound << "\n";
                _parentKeys.clear();
            }
        }
        osg::Group::traverse( nv );
    }

    当需要卸载的瓦片节点超过一定阈值后(默认为INT_MAX),对要删除的每一个瓦片节点执行如下操作:

    (1)判断该瓦片的所有子瓦片是否处于休眠状态Dormant,如果是从活跃瓦片寄存器中移除这些子瓦片(通过访问器ExpirationCollector来实现移除操作)。

    osgEarthDrivers/engine_rex/Unloader.cpp
    void apply(osg::Node& node)
            {
                // Make sure the tile is still dormat before releasing it
                TileNode* tn = dynamic_cast<TileNode*>( &node );
                if ( tn )
                {
                    _nodes.push_back(tn);
                    _tiles->remove( tn );
                    _count++;
                }
                traverse(node);
            }

    (2)对要移除的瓦片节点,放入资源释放器(本质是osg::Drawable对象),释放分配的opengl资源。并不是立即释放,而是要等到osgUtil::SceneView::draw时最终调用资源释放器的drawImplementation时进行释放,该draw不一定在帧循环中调用。资源释放器通过引用指针的方式管理要释放的瓦片节点,因此(3)中的移除不会真正从内存中移除,只有资源释放器移除后才会真正从内存中移除。

    osgEarth/ResourceReleaser.cpp
    void
    ResourceReleaser::releaseGLObjects(osg::State* state) const
    {
        osg::Drawable::releaseGLObjects(state);
    
        if (!_toRelease.empty())
        {
            Threading::ScopedMutexLock lock(_mutex);
            if (!_toRelease.empty())
            {
                METRIC_SCOPED("ResourceReleaser");
                for (ObjectList::const_iterator i = _toRelease.begin(); i != _toRelease.end(); ++i)
                {
                    osg::Object* object = i->get();
                    object->releaseGLObjects(state);
                }
                OE_DEBUG << LC << "Released " << _toRelease.size() << " objects\n";
                _toRelease.clear();
            }
        }
    }
    osgEarthDrivers/engine_rex/TileNode.cpp
    void
    TileNode::releaseGLObjects(osg::State* state) const
    {
        osg::Group::releaseGLObjects(state);
    
        if ( _surface.valid() )
            _surface->releaseGLObjects(state);
    
        if ( _patch.valid() )
            _patch->releaseGLObjects(state);
    
        _renderModel.releaseGLObjects(state);
    }

    (3)从场景树中移除子瓦片节点,从而保持了场景中瓦片和活跃瓦片寄存器中的瓦片是一致的。

     

     

     

     

     

     

    待继续分析列表:

    9、earth文件中都有哪些options((九)中问题)

    10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

    11、rex地理信息引擎的四梁八柱((九)中问题)

    12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题)

    13、RexTerrainEngineNode中_mapFrame的作用((十二)中问题)

    14、地形变形(Terrain morphing)((十二)中问题)

    15、地球瓦片过期门限的含义((十二)中问题)

    16、高分辨率优先的含义((十二)中问题)

    17、OSGEARTH_DEBUG_NORMALS环境变量的作用((十二)中问题)

    18、活跃瓦片寄存器的作用((十二)中问题)

    19、资源释放器子节点的作用((十二)中问题)

    20、共享几何图形池子节点的作用((十二)中问题)

    21、分页瓦片加载器子节点的作用((十二)中问题)

    22、分页瓦片卸载器子节点的作用((十二)中问题)

    23、栅格化器子节点的作用((十二)中问题)

    24、地形子节点的作用((十二)中问题)

    25、绑定渲染器的作用((十二)中问题)

    26、地图回调函数的作用((十二)中问题)

    27、如何将地图图层添加到rex引擎中((十二)中问题)

    28、选择信息的作用((十二)中问题)

    29、瓦片包围盒修改回调函数的作用((十二)中问题)

    30、刷新rex引擎((十二)中问题)

    31、刷新边界作用((十二)中问题)

    32、osgEarth::Metrics类的意义((十四)中问题)

    33、请求合并队列_mergeQueue((十四)中问题)

    34、分页瓦片加载器在更新遍历时对请求处理过程((十四)中问题)

    35、分页瓦片加载器在更新遍历时对已处理请求裁剪过程((十四)中问题)

    36、已处理的请求队列_requests((十四)中问题)

    37、DatabasePager中的_fileRequestQueue和_httpRequestQueue((十六)中问题)

    38、瓦片请求的生成到处理过程详解((十六)中问题)

    39、瓦片节点TileNode的创建过程((十七)中问题)

    40、request请求加载瓦片优先级的含义((十七)中问题)

    41、request的_internalHandle的作用((十七)中问题)

    42、DatabaseRequest中_objectCache含义((十七)中问题)

    42、osgEarth的多线程分析((十七)中问题)

    43、osgEarth的缓存及其结构((十七)中问题)

    44、DatabaseThread从缓存加载数据过程((十七)中问题)

    45、DatabaseThread从文件加载数据过程((十七)中问题)

    46、决定创建TileNode的时机条件((十七)中问题)

    47、TerrainEngineNode的createTileModel过程详解((十七)中问题)

    48、DatabaseThread中CompileSet的含义((十七)中问题)

    48、PagerLoader的traverse过程详解((十七)中问题)

    49、DatabaseThread的run过程详解((十七)中问题)

    50、LoadTileData的invoke过程详解((十七)中问题)

    51、TileNode的cull过程详解((十七)中问题)

    52、遮罩生成器osgEarth::Drivers::RexTerrainEngine::MaskGenerator((十八)中问题)

    53、RexTerrainEngineNode::traverse过程详解((十八)中问题)

    54、TileNode节点下的场景树分析((十八)中问题)

    55、地形瓦片大小尺寸和LOD的关系((十八)中问题)

    56、TileNode的_tileKeyValue作用((十八)中问题)

    57、TileNode的_morphConstants作用((十八)中问题)

    58、TileNode的_stitchNormalMap作用((十八)中问题)

    59、TileNode的_renderModel作用((十八)中问题)

    60、初始化高程栅格过程详解((十八)中问题)

    61、LoadTileData中的CreateTileModelFilter作用((十八)中问题)

    62、TileNode节点何时会从场景树中移除((十八)中问题)

    63、osgEarth::Map的Profile创建过程((二十)中问题)

    64、osgEarth::TerrainTileModelFactory添加颜色层和影像层的区别((二十一)中问题)

    65、osgEarth::PatchLayer修补层的作用((二十一)中问题)

    66、osgEarth::TerrainLayer中的_memCache(osgEarth::MemCache)详解((二十一)中问题)

    67、osgEarth::Layer::RenderType图层渲染类型的作用((二十一)中问题)

    68、osgEarth::TerrainLayer中TileSource的作用((二十一)中问题)

    69、earth文件没有设置高程图层会不会有默认高程层(高程均为0)((二十一)中问题)

    70、TerrainTileModelFactory::addColorLayers过程详解((二十一)中问题)

    71、TerrainTileModelFactory::addElevation过程详解((二十一)中问题)

    72、osgearth中可能用到的几个全局实例对象(osgDB::Registry osgEarth::Registry osg::Timer osg::DisplaySetting)((二十三)中问题)

    73、osgEarth::Map::addLayer过程详解((二十三)中问题)

    74、TileNode::setDirty过程详解((二十三)中问题)

    75、请求四个状态的含义(IDLE RUNNING MERGING FINISHED)((二十三)中问题)

    76、什么时候删除TileNode节点,不会一直增加吧((二十三)中问题)

    77、寄存器中请求状态活动记录的含义Registry::instance()->endActivity( req->getName() )((二十三)中问题)

    78、瓦片TileNode的生命周期流程详解((二十三)中问题)

    79、rex引擎如何将瓦片构造成地球形状((二十五)中问题)

    80、高程、影像文件格式详解((二十五)中问题)

    81、TileNode的merge过程详解((二十六)中问题)

    82、osgEarth支持的空间参考坐标系详解(osgEarth::SpatialReference、osgEarth::CubeSpatialReference、osgEarth::TangentPlaneSpatialReference)((二十九)中问题)

    83、osgEarth地球椭球体ellipsoid 大地基准面datum 地图投影Projection详解((二十九)中问题)

    84、空间参考坐标系和坐标系统类型的关系(geocentric projected)((二十九)中问题)

    85、proj4是什么((二十九)中问题)

    86、为什么要删除设置过的垂直水准面((二十九)中问题)

    87、osgEarth如何对投影坐标系和大地坐标系进行显示处理的((二十九)中问题)

    88、TileNode的节点构成,一个surface、tilenode((三十)中问题)

    89、MapFram和MapInfo的关系((三十)中问题)

    90、ModifyBoundingBoxCallback的使用时机和场合((三十)中问题)

    91、MapFrame为什么要单独存放高程层_elevationLayers,而不是放在图层_layers中((三十)中问题)

    92、MapFrame和Map中高程池的作用osg::ref_ptr<ElevationPool> _elevationPool((三十)中问题)

    93、osgEarth::Drivers::RexTerrainEngine::TileDrawable分析((三十)中问题)

    94、请求读取地理信息失败会如何处理((三十二)中问题)

    95、RexTerrainEngineNode的遍历过程详解((三十三)中问题)

    96、osgEarth::Drivers::RexTerrainEngine::TerrainCuller的apply过程详解((三十三)中问题)

    97、RexTerrainEngineNode的updateState过程详解 设置了很多着色器变量((三十三)中问题)

    98、什么时候分配opengl资源((三十三)中问题)

    99、TileNode释放opengl资源过程releaseGLObjects详解((三十三)中问题)

    100、最近一次遍历的帧号和时间是怎么设置呢(在渲染遍历里),怎么就不会再渲染遍历该瓦片节点了((三十三)中问题)

     

    展开全文
  • Swiper的分页器是靠mounted()挂载到Vue组件上而不是直接写在template里,所以在style scoped中写的样式无法作用分页器的点上。解决办法是把重写的样式写在scoped之外。(以下截图不完整,仅用做说明) template: ...
  • iview分页器删除后坑 iview分页器删除最后一页数据怎样跳转上一页 假如数据有21条,你删除第21条,iview不会自动跳转到你上一页,会在页面显示暂无数据,这时候我们就要看page是否传输正确页码 直接上代码吧 ...

    iview分页器删除后的坑

    iview分页器删除最后一页数据怎样跳转上一页

    假如数据有21条,你删除第21条,iview不会自动跳转到你的上一页,会在页面显示暂无数据,这时候我们就要看page是否传输正确的页码page

    直接上代码吧 这样来的方便!在这里插入图片描述
    设置初始值在这里插入图片描述
    划掉的没多大作用在这里插入图片描述
    在删除成功后加上这段代码在这里插入图片描述
    let totalPage = Math.ceil((this.count - 1) / this.pageSize) // 总页数
    let page = this.page > totalPage ? totalPage : this.page
    this.page = this.page < 1 ? 1 : page

    就这样了 可能描述得不好,新手,而且是第一次发,请见谅

    展开全文
  • 在rex引擎setMap中创建了分页瓦片加载子节点 osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp void RexTerrainEngineNode::setMap(const Map* map, const TerrainOptions&amp; options) { ...

    目标:(十二)中的问题21

    在rex引擎的setMap中创建了分页瓦片加载器子节点

    osgEarthDrivers/engine_rex/RexTerrainEngineNode.cpp
    void
    RexTerrainEngineNode::setMap(const Map* map, const TerrainOptions& options)
    {
        PagerLoader* loader = new PagerLoader( this );
        loader->setNumLODs(_terrainOptions.maxLOD().getOrUse(DEFAULT_MAX_LOD));
        loader->setMergesPerFrame( _terrainOptions.mergesPerFrame().get() );
        for (std::vector<RexTerrainEngineOptions::LODOptions>::const_iterator i = _terrainOptions.lods().begin(); i != _terrainOptions.lods().end(); ++i) {
            if (i->_lod.isSet()) {
                loader->setLODPriorityScale(i->_lod.get(), i->_priorityScale.getOrUse(1.0f));
                loader->setLODPriorityOffset(i->_lod.get(), i->_priorityOffset.getOrUse(0.0f));
            }
        }
    
        _loader = loader;
        this->addChild( _loader.get() );
    }

    首先是调用PagerLoader的构造函数,该函数设置节点路径_myNodePath,创建数据库选项_dboptions并设置文件位置回调函数和分页瓦片加载器,初始化各级lod的优先缩放和平移数值。

    然后根据rex引擎选项配置信息,设置lod的数目,一般为20.

    根据rex引擎选项配置信息,设置每帧合并处理的瓦片请求数(如果请求很多的话,每帧不会处理完所有请求的,会有个限值),默认为20个

    根据rex引擎选项配置信息,设置每级的优先缩放、平移数值

     

    加载器设置完成后,就会进入到帧循环中了。主要是在更新遍历时,

    1、设置帧戳

    2、处理队里中的请求,从请求合并队列_mergeQueue中取出请求进行处理,每次处理的数目不超过上面设置的每帧合并处理的瓦片请求数。这个请求本质上是osgEarth::Drivers::RexTerrainEngine::LoadTileData

    osgEarthDrivers/engine_rex/LoadTileData
    namespace osgEarth { namespace Drivers { namespace RexTerrainEngine
    {    
        class LoadTileData : public Loader::Request
        {}
    }
    }}

    3、裁剪已经处理过的请求,从已处理的请求队列_requests取出请求,进行裁剪处理。这个请求本质上也是osgEarth::Drivers::RexTerrainEngine::LoadTileData

    4、调用父类的更新遍历函数

     

     

     

     

     

     

     

    待继续分析列表:

    9、earth文件中都有哪些options((九)中问题)

    10、如何根据earth文件options创建不同的地理信息引擎节点((九)中问题)

    11、rex地理信息引擎的四梁八柱((九)中问题)

    12、osgEarth::TerrainEngineNode中setMap方法作用((十二)中问题)

    13、RexTerrainEngineNode中_mapFrame的作用((十二)中问题)

    14、地形变形(Terrain morphing)((十二)中问题)

    15、地球瓦片过期门限的含义((十二)中问题)

    16、高分辨率优先的含义((十二)中问题)

    17、OSGEARTH_DEBUG_NORMALS环境变量的作用((十二)中问题)

    18、活跃瓦片寄存器的作用((十二)中问题)

    19、资源释放器子节点的作用((十二)中问题)

    20、共享几何图形池子节点的作用((十二)中问题)

    21、分页瓦片加载器子节点的作用((十二)中问题)

    22、分页瓦片卸载器子节点的作用((十二)中问题)

    23、栅格化器子节点的作用((十二)中问题)

    24、地形子节点的作用((十二)中问题)

    25、绑定渲染器的作用((十二)中问题)

    26、地图回调函数的作用((十二)中问题)

    27、如何将地图图层添加到rex引擎中((十二)中问题)

    28、选择信息的作用((十二)中问题)

    29、瓦片包围盒修改回调函数的作用((十二)中问题)

    30、刷新rex引擎((十二)中问题)

    31、刷新边界作用((十二)中问题)

    32、osgEarth::Metrics类的意义((十四)中问题)

    33、请求合并队列_mergeQueue((十四)中问题)

    34、分页瓦片加载器在更新遍历时对请求处理过程((十四)中问题)

    35、分页瓦片加载器在更新遍历时对已处理请求裁剪过程((十四)中问题)

    36、已处理的请求队列_requests((十四)中问题)

     

     

     

    展开全文
  • DRF分页器源码分析

    2020-10-12 16:33:39
    一: 分析Paginator: 1: validate_num函数: 作用:校验number合法性。 2:get_page函数: ...作用:获取分页总数 7:page_range函数: 作用: 获取一个可迭代对象,用于以后遍历。 二:PageNumberPa
  • 遥控原理的分页

    2015-01-07 19:13:00
    索引:前几天看电视,使用遥控器的时候突然想到,我们的数据分页也可以用这种模式。于是敲出来一个类似于遥控器控制电视原理的分页。 现在详细介绍下上图中按钮的作用: 清除按钮:当按下0-9这个几个按钮时,...
  • Mybatis拦截器介绍及分页插件1.1目录1.2 前言拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被...
  • Hbase分页过滤

    2018-07-27 09:04:44
    常规filterlist使用多个过滤会导致有些过滤不起作用 解决方法: 1、获取需要分页的所有rowkey数目,存储在list中,通过pageindex和pagesize计算出起始rowkey 2、借鉴文章中的分页方法,使用起始rowkey...
  • 我们通常会在style标签中添加一个scoped属性,这样css样式只能作用于当前Vue组件。使组件之间样式相互独立,当调用该组件时候就不会影响其他组件样式或者被其他组件中样式所干扰。什么是scopedscoped是Vue中...
  • 文章来源:小灰博客| 时间:2013-10-...今天偶尔发现给一篇dede下长文章插入分页符(插入方式如图)不管用,研究了下是因为没有加{dede:pagebreak/},在内容模版里(一般是article_article.htm)找到{dede:field....
  • 因此,您当然可以在分页器作用域之前或之后链接任何其他条件。 基于可定制引擎I18n感知帮助器 由于整个分页助手基本上只是链接和非链接集合,因此Kaminari通过Engine内部其自己局部模板来呈现每个链接。 ...
  • Mybatis拦截器分页

    2017-06-30 22:34:55
    Mybatis 拦截器介绍1.1 目录1.2 前言1.3 Interceptor接口1.4 注册拦截器1.5 Mybatis可拦截的方法1.6 利用拦截器进行分页 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后...
  • 适用于iOS简单视图分页器,其作用类似于androidviewPager。 与iOS 8.0或更高版本兼容。 在所有界面方向上都支持iPhone和iPad。 目录 预习 iPhone界面: iPad介面: 优点 同时支持Swift(v2.2和v3.0)和...
  • MyBatis拦截实现分页

    千次阅读 2018-01-04 16:12:36
    拦截器的作用就是拦截某些方法的调用,我们可以在方法执行前后为方法加上某些逻辑,也可以只执行拦截的逻辑代码而不执行被拦截的方法。Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而...
  • mybatis拦截分页机制

    千次阅读 2018-04-08 09:56:52
    转载自 moshenglv 点击打开链接Mybatis 拦截器介绍 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而...
  • 最近在尝试用nuxtjs来搭建新的站点,但是平时在jquery里面用惯的一些...Swiper的分页器是靠mounted()挂载到Vue组件上而不是直接写在template里,所以在style scoped中写的样式无法作用分页器的点上。解决办法是...
  •  拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法。Mybatis拦截器设计的一个初衷...
  • Mybatis拦截介绍及分页插件

    万次阅读 2014-11-03 10:28:00
    Mybatis拦截器介绍及分页插件 1.1 目录 ... 拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻
  • Android4.0Launcher自带了一个简单的分页指示,就是Hotseat上面那个线段,这个...这个所谓的分页指示器作用很简单,就是告诉用户界面有多少分屏,目前处于第几分屏。当然目前也有一些Launcher增强了这个功能,...
  • 如上图所示,前往某一页在谷歌浏览中是完全没有问题,但是当在ie浏览下,输入框内可以输入任何字符,而且当输入完成后,用户按下回车键,第一次跳转到指定页,再次输入时,按下回车键没有任何作用,重新刷新...
  • 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。 在了解解析器之前,我们要先知道Accept以及ContentType请求头。 Accept是...
  • 不知道哪里操作错误突然就没办法分页了、对比了好几个页面、终于发现是在“WEB窗体设计生成代码”里少了一行代码、这让我觉得非常奇怪、、不是自动添加么?怎么会少掉呢??而且编译时候也不出错、、这种...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 281
精华内容 112
关键字:

分页器的作用