Я написал директиву, которая захватывает события клавиатуры, а на некоторых ключах я обновляю некоторые объекты в области. Идея состоит в том, чтобы перемещать вверх и вниз по массиву и отображать выбранные данные о строках. Проблема заключается в том, что страница не обновляется, пока я не сделаю еще одно действие, которое обновляет страницу. Как я могу заставить это?Как обновить страницу angularjs после обновления области?
Вот директива:
LogApp.directive("keyCapture", [function(){
var scopeInit;
return{
link: function(scope, element, attrs, controller){
scopeInit = scope
element.on('keydown', function(e){
scopeInit[attrs.keyCapture].apply(null, [e]);
});
}
}
}]);
Связанный шаблон, как это:
<body ng-controller="logCtrl" key-capture="movePreview">
Способ управления:
$scope.movePreview = function(e){
if ($scope.events.length === 0)
return;
// Find the element
if (e.keyCode === 38 || e.keyCode === 40){
console.log("Pressed %s", e.keyCode);
var offset = 0;
if (e.keyCode === 38 && $scope.previewIndex > 0)
offset = -1;
else if (e.keyCode === 40 && $scope.previewIndex < $scope.events.length -1)
offset = 1;
$scope.previewIndex += offset;
var eventId = $scope.events[$scope.previewIndex].uuid;
$scope.showEvent(eventId);
e.preventDefault();
}
};
$scope.showEvent(eventId)
примет элемент с заданным идентификатором и отображать его в другой части страницы. Часть, которая не обновляется до тех пор, пока не будет выполнено другое действие, например, нажатие кнопки. Возможно ли принудительное обновление страницы?
Вот скрипка, которая воспроизводит: http://jsfiddle.net/gM2KF/1/ Если вы нажмете на кнопку, счетчик будет обновлен. Если вы нажмете любую клавишу, ничего не появится. Но вы снова нажимаете кнопку, вы видите, что счетчик был обновлен событием клавиатуры, но не отображался.
Какова наилучшая практика: вызовите 'scope. $ Apply()' после изменения или, как предполагает m59, оберните код в $ apply? Какая разница? – Antoine
@Antoine лучше обернуть часть кода с помощью 'scope. $ Apply (function() {/ ** /}', чем просто вызвать 'scope. $ Apply();' вызывать цикл diggest только для части кода –
Хмм, извинения, кстати ... Я бы просто прокомментировал ваш ответ, но в то время не было ответов. Я никогда не видел, чтобы это делалось раньше. – m59