我正在使用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()甚至是最差的。它似乎刷新了文档中的每个节点。不仅是当前的控制器。
我已经尝试了我发现的每一种方法(方法,对象,......)但似乎没有任何工作。
有什么想法吗?
答案 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/