应用ng-pressstart和ng-pressend指令后,Angularjs ng-click无法正常工作

时间:2015-12-03 16:43:57

标签: javascript angularjs

我有一个角度应用程序,它在桌面浏览器上运行正常。但是在我尝试在android chrome上打开它之后,ng-click很少工作。点击100次后,它可能会起作用并触发点击。在分析了我得到原因的代码后,我创建了一个js文件来创建新的angular指令:

var app;

var getOnTouchEndEventName = function () {
    var isTouchSupported = "ontouchend" in document;
    if (isTouchSupported) {
        return "touchend";
    } else {
        return "mouseup";
    }
};

var getOnTouchStartEventName = function () {
    var isTouchSupported = "ontouchend" in document;
    if (isTouchSupported) {
        return "touchstart";
    } else {
        return "mousedown";
    }
};

app.directive("ngPressstart", [function () {
    return function (scope, elem, attrs) {
        elem.bind(getOnTouchStartEventName(), function (e) {
            e.preventDefault();
            e.stopPropagation();
            scope.$apply(attrs["ngPressstart"]);
        });
    }
}]);

app.directive("ngPressend", [function () {
    return function (scope, elem, attrs) {
        elem.bind(getOnTouchEndEventName(), function (e) {
            e.preventDefault();
            e.stopPropagation();
            scope.$apply(attrs["ngPressend"]);
        });
    }
}]);

因此有两个指令:ng-pressstartng-pressend,目的是为移动和桌面浏览器使用一个指令。例如,如果它的移动设备然后getOnTouchEndEventName()将返回touchend。否则为mouseup

修复此实施的方法是什么?

即使我没有使用这些指令,也会出现问题。

1 个答案:

答案 0 :(得分:0)

正如我在评论中所述,此文件开头的声明不是angular的正确语法。通过在此文件中声明bool theFunction() { FILE* pPipe; char buffer[1000]; if( (pPipe = _popen("dir", "rt")) == NULL ) { return false; } while(fgets(pipeBuffer, maxBufferSize, pPipe)) { printf(pipeBuffer); } // The fact that you have to close it here in the middle of nowhere // should ring a bell that you need to think about separation of concern _pclose(pPipe); if( (pPipe = _popen("cls", "rt")) == NULL ) { return false; } _pclose(pPipe); return true; } ,您无意中导致名称冲突。

向角度模块添加组件的正确方法是使用模块getter语法。

以角色管理模块的推荐方法是根本不使用变量。 https://github.com/johnpapa/angular-styleguide#style-y021

例如,在声明角度应用时,而不是执行:

var app;

你可以简单地使用:

var app = angular.module('game1', []);

在声明组件(控制器,指令,过滤器等)时,您可以使用链接getter语法。 https://github.com/johnpapa/angular-styleguide#style-y022

angular.module('game1', []);

这可确保您永远不会发生命名冲突,并使您的代码更具可读性。