Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 以编程方式选择actionsheet会引发错误_Javascript_Jquery_Kendo Ui_Jasmine_Kendo Mobile - Fatal编程技术网

Javascript 以编程方式选择actionsheet会引发错误

Javascript 以编程方式选择actionsheet会引发错误,javascript,jquery,kendo-ui,jasmine,kendo-mobile,Javascript,Jquery,Kendo Ui,Jasmine,Kendo Mobile,我正在使用uitest.js(基于Jasmine.js构建)测试我们的剑道UI移动应用程序。我正在显示一个操作表,并以编程方式选择其中一个选项。这在应用程序中正常工作,但会抛出一个测试失败的错误 我使用的行动表如下: <ul data-role="actionsheet" id="marketplace-price-actions" > <li class="km-actionsheet-title">Select Price</li> <

我正在使用uitest.js(基于Jasmine.js构建)测试我们的剑道UI移动应用程序。我正在显示一个操作表,并以编程方式选择其中一个选项。这在应用程序中正常工作,但会抛出一个测试失败的错误

我使用的行动表如下:

<ul data-role="actionsheet" id="marketplace-price-actions" >
    <li class="km-actionsheet-title">Select Price</li>
    <li><a href="#" data-action="setPriceFilter('3')">$$$</a></li>
    <li><a href="#" data-action="setPriceFilter('2')">$$</a></li>
    <li><a href="#" data-action="setPriceFilter('1')">$</a></li>
</ul>
这是可行的,但会引发以下错误:

TypeError: "undefined is not a function"
我已经创建了一个JSFIDLE,它在上显示这个。一定要打开控制台


编辑根据所选答案,错误是将值传递给函数。我选择创建单独的回调。请参阅。

看起来您不应该向操作传递参数。我不知道为什么它会以这种方式实现,但这会导致您的错误(如果您只需单击它,也会发生这种情况,因此它与Jasmine无关)

据我所知,你有三个选择:

  • 对每个项目使用单独的回调
  • 修改ActionSheet源代码,将单击的元素提供给操作
  • 对传递的值使用闭包并返回处理程序
  • 如果您只需要传递一个值,但希望避免由于多个处理程序而导致代码重复,那么选项3似乎是最佳解决方案。 请注意,我根本没有测试过以下解决方案,因此使用风险自负

    对于选项2,类似的方法可能会起作用:

    kendo.mobile.ui.ActionSheet.fn._click = (function (click) {
        return function (e) {
            if (e.isDefaultPrevented()) {
                return;
            }
    
            var action = $(e.currentTarget).data("action");
    
            if (action) {
                kendo.getter(action)(window)({
                    target: this.target,
                    context: this.context,
                    element: e.currentTarget // pass in the element that was clicked on 
                });
            }
    
            e.preventDefault();
            this.close();
        }
    })(kendo.mobile.ui.ActionSheet.fn._click);
    
    这样,您至少可以知道单击了哪个元素,并且如果需要,您可以添加数据属性来传递数据,例如:

    <li><a href="#" data-value="2" data-action="alertme">$$</a></li>
    
    ()

    对于选项3,您只需将您的行动定义为:

    function alertme(val) {
        return function(e) {
            console.log(e);
            console.log(val);
        };
    }
    
    你的元素应该是:

        <li><a href="#" data-action="alertme('2')">$$</a>
    

  • ()

    顺便说一句,我正在使用.mousedown().mouseup(),因为显然kendoui正在捕获.click(),并以不同的方式处理它。我们在控制台中到底在寻找什么?错误显示在控制台中可能是您链接了错误的演示;这只显示了一个按钮我已经更新了上面的链接。谢谢。我最后选择了简单的选项1,因为你是个天才。你的2号解决方案正是我需要的,谢谢你的例子!
    function alertme(val) {
        return function(e) {
            console.log(e);
            console.log(val);
        };
    }
    
        <li><a href="#" data-action="alertme('2')">$$</a>