按键上的AngularJS绑定

时间:2014-03-20 21:04:22

标签: html angularjs svg

我正在使用AngularJS开发SVG应用程序。我们需要进行一些修改才能完全支持我们的内部浏览器,但它似乎正在运行。

请参阅我的示例:http://jsfiddle.net/Thc44/

function Ctrl($scope, $rootScope) {
    $scope.tst = "iniValue";
    $scope.obj = { value : "iniValue2"};

    document.onkeydown = function(event) {
        $rootScope.$broadcast("keyDown", event.keyCode);
        $scope.keyCode = event.keyCode;
    };

    $scope.keyHandler = function(event, keyCode) {
        $scope.tst = keyCode;
        $scope.obj = { value : keyCode};
        // $scope.$digest();
    };

    $scope.$on("keyDown", $scope.keyHandler);
}

我试图通过按键事件更新HTML中的某些值。 我无法使用ng-keyup,因为我们的浏览器或SVG文档不支持它。

如果我们使用 $ scope。$ digest()方法,一切正常,但似乎我们失去了很多性能。 $ scope.apply()甚至是最差的。它似乎刷新了文档中的每个节点。不仅是当前的控制器。

我已经尝试了我发现的每一种方法(方法,对象,......)但似乎没有任何工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定您为什么要使用广播来发送活动。这似乎是不必要的开销。如果您需要与所有范围进行通信,您可以将密钥代码设置为$rootScope,如下所示:

document.onkeydown = function(event) {
    $rootScope.$apply(function() {
        $rootScope.keyCode = event.keyCode;
    });
};

这是由子范围自动继承的,然后它不是监听广播并在所有文档节点上强制摘要,而是仅触发关键代码的侦听器。您可以使用$watch来监听更改:

$scope.$watch('keyCode', function () {
    if ($scope.keyCode) {
        $scope.tst = $scope.keyCode;
        $scope.obj = { value : $scope.keyCode};       
    }
});

这应该比广播方法表现更好。这是一个工作小提琴:http://jsfiddle.net/jeremylikness/P8987/