wcf服务被呼叫两次



我在html表上使用无限滚动。这是我用来做无限滚动的代码

$('#divTable').bind('scroll', function () {
        if ($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
            currentPageNo = currentPageNo + 1;
            myservice(id, pageSize, currentPageNo);

        }
    });

当页面加载时,它会在我的表中填充100条记录,因为我将页面大小传递为100。当我在表格底部向下滚动时,它会调用此代码myservice(id, pageSize, currentPageNo);两次。我不明白它为什么叫两次。

这是我的html

<div id="divTable" style="height: 535px;overflow-y: auto;overflow-x: hidden">
                    <table>
                        <tbody data-bind="foreach: myData">
                            <tr >
                                <td style="padding: 8px;width: 50px;" data-bind="text: Id "></td>

                            </tr>
                        </tbody>
                    </table>
                </div>

当我试图劫持滚动事件并使用它允许我的用户一次前进一页时,我遇到了类似的问题。在轨迹板上,你可以进行我所说的"中间滚动",这会导致你的事件处理程序触发太多次。

您需要能够识别惯性滚动,并且只有在滚动不是惯性滚动时才运行事件处理程序。

下面是一个代码片段:

var event = normalizeEvent(event);
  if(event.timeStamp - smartScroll.timeStamp < 50){
    smartScroll.inertia = true;
  }else{
    smartScroll.inertia = false;
  }

根据smartScroll.inertia的值,您可以确定事件处理程序是否应该做出反应。

您可以在这里挑选完整的代码,尽管这里有很多与您的案例无关的代码:http://www.oliverpetkovski.com/javascript/main.js

以下是使用我的"智能滚动"代码和jquery draggable的完整答案,允许您通过滚动条和mousewheeel调用记录。

https://github.com/maggiesavovska/knockoutEndlessScroll

注意:如果您仍然看到"中间滚动"发生,则必须调整第99行的if语句,增加实际事件时间戳与上一次滚动事件的时间戳之间的阈值。这将指示滚动是真实的、用户想要的还是惯性的。如果这个数字太高,你的用户在尝试一个接一个地快速滚动时会被卡住。如果它太低,那么无尽的滚动将出乎意料地前进。这是我所指的代码:

if(event.timeStamp - smartScroll.timeStamp < 70)

您还必须确保将数组设置为在敲除中可观察,并使用敲除定义的正确设置方法在每个滚动事件上设置其值。http://knockoutjs.com/documentation/observables.html

要了解我在说什么,请参阅视图模型中的第15行和smartScroll.scrollEvent 的第55行

对于这些数据,我在js文件中创建了一个数据对象,稍后集成服务后可以将其删除。要使用您的服务,请在代码中搜索注释"//call service",这是您需要调用服务的地方,传入代码中已经存在的pageNumber变量、页面大小,然后返回数组。

您还需要知道包含数据的数组的完整长度。这将决定可拖动滚动元素的大小,如果你在数据的末尾,你可以将滚动元素定位在顶部或底部。在代码中的任何地方,只要它说model1.newArray.length,就必须提供整个数据数组的长度。

搜索评论"//以后开始删除",并在集成服务后删除从那里到"//以后结束删除"的所有内容。

请记住,model1.curArray必须使用setter设置,而不是使用等号。这就是目前的情况,所以请确保不要更改。这就是我的意思:更正(使用设置):model1.curArray(model1.newArray[model1.pageNumber]);错误(使用等号):model1.curArray=model1.newArray[model1.pageNumber];

有些代码可以进行优化。如果我有空的话,我会把它清理干净,但它有效。

最新更新