滑动显示不起作用 [英] Swipe to Reveal is not working

查看:19
本文介绍了滑动显示不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我实现了滑动以显示 Oracle JET 组件.

下面是我的js代码

 this.action = ko.observable("还没有采取任何行动");this.handleReady = function(){//注册滑动以显示所有新列表项$("#listview").find(".item-marker").each(function(index){var item = $(this);var id = item.prop("id");var startOffcanvas = item.find(".oj-offcanvas-start").first();var endOffcanvas = item.find(".oj-offcanvas-end").first();//设置滑动动作oj.SwipeToRevealUtils.setupSwipeActions(startOffcanvas);oj.SwipeToRevealUtils.setupSwipeActions(endOffcanvas);//确保监听器只注册一次endOffcanvas.off("ojdefaultaction");endOffcanvas.on("ojdefaultaction", function(){self.handleDefaultAction(item);});});};this.handleDestroy = function(){//注册滑动以显示所有新列表项$("#listview").find(".item-marker").each(function(index){var startOffcanvas = $(this).find(".oj-offcanvas-start").first();var endOffcanvas = $(this).find(".oj-offcanvas-end").first();oj.SwipeToRevealUtils.tearDownSwipeActions(startOffcanvas);oj.SwipeToRevealUtils.tearDownSwipeActions(endOffcanvas);});};this.handleMenuBeforeOpen = function(event, ui){var target = event.originalEvent.target;var context = $("#listview").ojListView("getContextByNode", target);如果(上下文!= null){self.currentItem = $("#"+context['key']);}别的{self.currentItem = null;}};this.handleMenuItemSelect = function(event, ui){var id = ui.item.prop("id");如果(id ==读")self.handleRead();else if (id == "more1" || id == "more2")self.handleMore();否则如果(id ==标签")self.handleFlag();否则如果(id ==删除")self.handleTrash();};this.closeToolbar = function(which, item){var toolbarId = "#"+which+"_toolbar_"+item.prop("id");var drawer = {"displayMode": "push", "selector": toolbarId};oj.OffcanvasUtils.close(抽屉);};this.handleAction = function(which, action, event){如果(事件!= null){self.currentItem = $(event.target).closest(".item-marker");//offcanvas 不会为默认操作案例打开如果(动作!=默认")self.closeToolbar(which, self.currentItem);}if (self.currentItem != null)self.action("处理"+action+" action on: "+self.currentItem.prop("id"));};this.handleRead = 函数(数据,事件){self.handleAction("first", "read", event);};this.handleMore = 函数(数据,事件){self.handleAction("second", "more", event);};this.handleFlag = 函数(数据,事件){self.handleAction("second", "Rejected", event);};this.handleTrash = 函数(数据,事件){self.handleAction("second", "Accepted", event);self.remove(self.currentItem);};this.handleDefaultAction = function(item){self.currentItem = 项目;self.handleAction("second", "default");self.remove(item);};this.remove = 功能(项目){//取消注册滑动以显示已删除的项目var startOffcanvas = item.find(".oj-offcanvas-start").first();var endOffcanvas = item.find(".oj-offcanvas-end").first();oj.SwipeToRevealUtils.tearDownSwipeActions(startOffcanvas);oj.SwipeToRevealUtils.tearDownSwipeActions(endOffcanvas);警报(JSON.stringify(self.allItems()));警报(item.toString());self.allItems.remove(功能(当前){return (current.id == item.prop("id"));});};}返回 PeopleViewModel;});

HTML 代码:

 
    <script id="peoplelist_template">

     

    <div class="oj-flex oj-flex-items-pad"><div class="oj-flex-item oj-lg-4 oj-md-4"><img alt="员工形象" class="demo-circular demo-employee-photo" style="float:left;"data-bind="attr: {src: $parent.getPhoto($data['name'])}"/><h2 class="demo-employee-name" data-bind="text: $data['from']"></h2><div class="demo-employee-title" data-bind="text: $data['title']"></div><div class="demo-employee-dept" data-bind="text: $data['deptName']"></div>

    <div style="line-height: 1.5em; height: 3em; overflow: hidden; text-overflow: ellipsis" class="oj-text-sm oj-text-secondary-color" data-bind="text:$data['content']"></div>

    <div tabIndex="-1" data-bind="attr: {id: 'first_toolbar_'+empId}" class="oj-offcanvas-start" style="width:75px"><div data-bind="click:$parent.handleRead"><div class="oj-flex-bar" style="height:100%"><div class="oj-flex-bar-center-absolute"><div class="oj-flex oj-sm-flex-direction-column"><div title=".demo-library-icon-24" role="img" class="oj-flex-item demo-library-icon-24 demo-icon-font-24"></div><div style="padding-top: 10px" class="oj-flex-item">读取</div>

    <div tabIndex="-1" data-bind="attr: {id: 'second_toolbar_'+empId}" class="oj-offcanvas-end" style="width:225px"><div class="oj-swipetoreveal-more" data-bind="点击:$parent.handleMore"><div class="oj-flex-bar" style="height:100%"><div class="oj-flex-bar-center-absolute"><div class="oj-flex oj-sm-flex-direction-column"><div title=".demo-library-icon-24" role="img" class="oj-flex-item fa fa-bars"></div><div style="padding-top: 10px" class="oj-flex-item">更多</div>

    <div style="background-color:#b81900" data-bind="click: $parent.handleFlag" class="oj-swipetoreveal-flag"><div class="oj-flex-bar" style="height:100%"><div class="oj-flex-bar-center-absolute"><div class="oj-flex oj-sm-flex-direction-column"><div title=".demo-library-icon-24" role="img" class="oj-flex-item fa fa-times"></div><div style="padding-top: 10px" class="oj-flex-item">拒绝</div>

    <div style="background-color:#009638" data-bind="click: $parent.handleTrash" class="oj-swipetoreveal-alert oj-swipetoreveal-default"><div class="oj-flex-bar" style="height:100%"><div class="oj-flex-bar-center-absolute"><div class="oj-flex oj-sm-flex-direction-column"><div title=".demo-library-icon-24" role="img" class="oj-flex-item fa fa-check"></div><div style="padding-top: 10px" class="oj-flex-item">批准</div>

    实际问题是在批准时listItem没有被删除.(批准div是调用Handletrash函数).

    我不知道我哪里出错了?有人能帮我解决这个问题吗??

    解决方案

    这里有很多代码,这使得很难理解每件事的意图,也更难查明可能是什么问题.这就是为什么最好制作一个最小、完整和可验证的示例.另外,在删除所有不直接影响您的问题的代码的过程中,您可以自己解决.

    我注意到在您的代码中您有许多 jQuery 调用.这是一个重要的危险信号.您与 Knockout 的合同是您将操作您的数据模型,而 Knockout 将使用它来控制 DOM.如果你跟在 Knockout 的后面"并自己操作 DOM,那么你和 Knockout 将会互相踩踏.

    Knockout 为您提供了两种方法来自定义它如何操作 DOM:动画过渡自定义绑定.滑动显示"听起来对我来说是一种过渡,但是看看您的代码,似乎涉及整个生命周期,所以我认为您需要制作一个自定义绑定处理程序.

    您所有的 DOM 操作代码都应该在绑定处理程序中,并且所有代码都应该限制在绑定处理程序的 element 中.不应该有文档范围的选择器.

    I have implemented a swipe to reveal Oracle JET component.

    Below is my Js code

       this.action = ko.observable("No action taken yet");
    
       this.handleReady = function()
        {
    
            // register swipe to reveal for all new list items
            $("#listview").find(".item-marker").each(function(index)
            {
                var item = $(this);
    
                var id = item.prop("id");
    
    
                var startOffcanvas = item.find(".oj-offcanvas-start").first();
                var endOffcanvas = item.find(".oj-offcanvas-end").first();     
    
                // setup swipe actions               
                oj.SwipeToRevealUtils.setupSwipeActions(startOffcanvas);
                oj.SwipeToRevealUtils.setupSwipeActions(endOffcanvas);
    
                // make sure listener only registered once
                endOffcanvas.off("ojdefaultaction");
                endOffcanvas.on("ojdefaultaction", function() 
                {
                    self.handleDefaultAction(item);
                });
            });
        };
    
        this.handleDestroy = function()
        {
            // register swipe to reveal for all new list items
            $("#listview").find(".item-marker").each(function(index)
            {
                var startOffcanvas = $(this).find(".oj-offcanvas-start").first();                    
                var endOffcanvas = $(this).find(".oj-offcanvas-end").first();                    
    
                oj.SwipeToRevealUtils.tearDownSwipeActions(startOffcanvas);
                oj.SwipeToRevealUtils.tearDownSwipeActions(endOffcanvas);
            });
        };
    
        this.handleMenuBeforeOpen = function(event, ui)
        {
            var target = event.originalEvent.target;
            var context = $("#listview").ojListView("getContextByNode", target);
    
            if (context != null)
            {
                self.currentItem = $("#"+context['key']);
            }
            else
            {
                self.currentItem = null;
            }
        };
    
        this.handleMenuItemSelect = function(event, ui)
        {
            var id = ui.item.prop("id");
            if (id == "read")
                self.handleRead();
            else if (id == "more1" || id == "more2")
                self.handleMore();
            else if (id == "tag")
                self.handleFlag();
            else if (id == "delete")
                self.handleTrash();
        };
    
        this.closeToolbar = function(which, item)
        {
            var toolbarId = "#"+which+"_toolbar_"+item.prop("id");
            var drawer = {"displayMode": "push", "selector": toolbarId};
    
            oj.OffcanvasUtils.close(drawer);
        };
    
        this.handleAction = function(which, action, event)
        {
            if (event != null)
            {
                self.currentItem = $(event.target).closest(".item-marker");
    
                // offcanvas won't be open for default action case
                if (action != "default")
                    self.closeToolbar(which, self.currentItem);
            }
    
            if (self.currentItem != null)
                self.action("Handle "+action+" action on: "+self.currentItem.prop("id"));
        };
    
        this.handleRead = function(data, event)
        {
            self.handleAction("first", "read", event);
        };
    
        this.handleMore = function(data, event)
        {
            self.handleAction("second", "more", event);
        };
    
        this.handleFlag = function(data, event)
        {
            self.handleAction("second", "Rejected", event);
        };
    
        this.handleTrash = function(data, event)
        {
            self.handleAction("second", "Accepted", event);
            self.remove(self.currentItem);
    
        };
    
        this.handleDefaultAction = function(item)
        {
            self.currentItem = item;
            self.handleAction("second", "default");
            self.remove(item);
        };
    
        this.remove = function(item)
        {
            // unregister swipe to reveal for removed item
            var startOffcanvas = item.find(".oj-offcanvas-start").first();                    
            var endOffcanvas = item.find(".oj-offcanvas-end").first();                    
    
            oj.SwipeToRevealUtils.tearDownSwipeActions(startOffcanvas);
            oj.SwipeToRevealUtils.tearDownSwipeActions(endOffcanvas);
       alert(JSON.stringify(self.allItems()));
    
       alert(item.toString());
             self.allItems.remove(function(current)
            {
                return (current.id == item.prop("id"));
    
    
            });            
        };
        }
        return PeopleViewModel;
        });
    

    HTML code:

           <ul id="listview"
            data-bind="ojComponent: {component: 'ojListView',
            data: listViewDataSource,
            item: {template: 'peoplelist_template'},
            selectionMode: 'single',
            ready: handleReady, 
            destroy: handleDestroy, 
            optionChange: changeHandler,
            rootAttributes: {style: 'width:100%;height:100vh;overflow:auto; margin-top: 5px'},
            scrollPolicy: 'loadMoreOnScroll',
            scrollPolicyOptions: {fetchSize: 10}}">
        </ul>
    
    <script id="peoplelist_template">
    

            <div style="padding:0.8571rem">
    
             <div class="oj-flex oj-flex-items-pad">
                    <div class="oj-flex-item oj-lg-4 oj-md-4">
                        <img alt="employee image" class="demo-circular demo-employee-photo" style="float:left;" data-bind="attr: {src: $parent.getPhoto($data['name'])}"/>
                        <h2 class="demo-employee-name" data-bind="text: $data['from']"></h2>
                        <div class="demo-employee-title" data-bind="text: $data['title']"></div>
                        <div class="demo-employee-dept" data-bind="text: $data['deptName']"></div>
                    </div>
    
                      <div style="line-height: 1.5em; height: 3em; overflow: hidden; text-overflow: ellipsis" class="oj-text-sm oj-text-secondary-color" data-bind="text: $data['content']"></div>
    
                </div>
      </div>
             <div tabIndex="-1" data-bind="attr: {id: 'first_toolbar_'+empId}" class="oj-offcanvas-start" style="width:75px">
                 <div data-bind="click:$parent.handleRead">
                     <div class="oj-flex-bar" style="height:100%">
                         <div class="oj-flex-bar-center-absolute">
                             <div class="oj-flex oj-sm-flex-direction-column">
                                 <div title=".demo-library-icon-24" role="img" class="oj-flex-item demo-library-icon-24 demo-icon-font-24"></div>
                                 <div style="padding-top: 10px" class="oj-flex-item">Read</div>
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
    
             <div tabIndex="-1" data-bind="attr: {id: 'second_toolbar_'+empId}" class="oj-offcanvas-end" style="width:225px">
                 <div  class="oj-swipetoreveal-more" data-bind="click: $parent.handleMore">
                     <div class="oj-flex-bar" style="height:100%">
                         <div class="oj-flex-bar-center-absolute">
                             <div class="oj-flex oj-sm-flex-direction-column">
                                 <div title=".demo-library-icon-24" role="img" class="oj-flex-item fa fa-bars"></div>
                                 <div style="padding-top: 10px" class="oj-flex-item">More</div>
                             </div>
                         </div>
                     </div>
                 </div>
                 <div style="background-color:#b81900" data-bind="click:      $parent.handleFlag"  class="oj-swipetoreveal-flag">
                     <div class="oj-flex-bar" style="height:100%">
                         <div class="oj-flex-bar-center-absolute">
                             <div class="oj-flex oj-sm-flex-direction-column">
                                 <div title=".demo-library-icon-24" role="img" class="oj-flex-item fa fa-times"></div>
                                 <div style="padding-top: 10px" class="oj-flex-item">Reject</div>
                             </div>
                         </div>
                     </div>
                 </div>
                 <div  style="background-color:#009638" data-bind="click: $parent.handleTrash" class="oj-swipetoreveal-alert oj-swipetoreveal-default">
                     <div class="oj-flex-bar" style="height:100%">
                         <div class="oj-flex-bar-center-absolute">
                             <div class="oj-flex oj-sm-flex-direction-column">
                                 <div title=".demo-library-icon-24" role="img" class="oj-flex-item fa fa-check"></div>
                                 <div style="padding-top: 10px" class="oj-flex-item">Approve</div>
                             </div>
                         </div>
                     </div>
                 </div>
             </div>
          </div>
        </div>
       </li>
    </script>
    

    Actual problem is the listItem is not getting removed while approving.(The Approve div is call Handletrash function).

    I dont know where I went wrong ??could anyone help me to solve this issue??

    解决方案

    There's a lot of code here, which makes it hard to understand what everything is intended to do, and harder to pinpoint what the problem might be. That's why it's best to make a Minimal, Complete, and Verifiable Example. Also, in the process of removing all the code that does not directly affect your problem, you may solve it yourself.

    I notice in your code that you have a number of jQuery calls. That's a significant red flag. Your contract with Knockout is that you will manipulate your data model and Knockout will use it to control the DOM. If you "go behind Knockout's back" and manipulate the DOM yourself, you and Knockout are going to be stepping on each other's toes.

    Knockout provides two ways for you to customize how it manipulates the DOM: animated transitions and custom bindings. "Swipe to reveal" sounds like a transition to me, but looking at your code, it appears there's a whole lifecycle involved, so I think you need to make a custom binding handler.

    All of your DOM-manipulating code should be inside the binding handler, and all of it should be restricted to the element of the binding handler. There should be no document-wide selectors.

    这篇关于滑动显示不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    相关文章
    前端开发最新文章
    热门教程
    热门工具
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆