AngularJS - Bindung an Direktiven-Größenänderung
Wie kann ich benachrichtigt werden, wenn eine Richtlinie geändert wird?
ich habe versucht
element[0].onresize = function() {
console.log(element[0].offsetWidth + " " + element[0].offsetHeight);
}
aber nicht die Funktion aufrufen,
(function() {
'use strict';
//Define the directive on the module.
//Inject the dependencies.
//Point to the directive definition function.
angular.module('app').directive('nvLayout', ['$window', '$compile', layoutDirective]);
function layoutDirective($window, $compile) {
//Usage:
//
//Creates:
//
var directive = {
link: link,
restrict: 'EA',
scope: {
layoutEntries: "=",
selected: "&onSelected"
},
template: "<div></div>",
controller: controller
};
return directive;
function link(scope, element, attrs) {
var elementCol = [];
var onSelectedHandler = scope.selected();
element.on("resize", function () {
console.log("resized.");
});
$(window).on("resize",scope.sizeNotifier);
scope.$on("$destroy", function () {
$(window).off("resize", $scope.sizeNotifier);
});
scope.sizeNotifier = function() {
alert("windows is being resized...");
};
scope.onselected = function(id) {
onSelectedHandler(id);
};
scope.$watch(function () {
return scope.layoutEntries.length;
},
function (value) {
//layout was changed
activateLayout(scope.layoutEntries);
});
function activateLayout(layoutEntries) {
for (var i = 0; i < layoutEntries.length; i++) {
if (elementCol[layoutEntries[i].id]) {
continue;
}
var div = "<nv-single-layout-entry id=slot" + layoutEntries[i].id + " on-selected='onselected' style=\"position:absolute;";
div = div + "top:" + layoutEntries[i].position.top + "%;";
div = div + "left:" + layoutEntries[i].position.left + "%;";
div = div + "height:" + layoutEntries[i].size.height + "%;";
div = div + "width:" + layoutEntries[i].size.width + "%;";
div = div + "\"></nv-single-layout-entry>";
var el = $compile(div)(scope);
element.append(el);
elementCol[layoutEntries[i].id] = 1;
}
};
}
function controller($scope, $element) {
}
}
})();
InformationsquelleAutor der Frage li-raz | 2014-01-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden scope.$Uhr mit einer custom-Uhr-Funktion:
InformationsquelleAutor der Antwort epegzz
Würden Sie in der Regel sehen wollen das element
offsetWidth
undoffsetHeight
Eigenschaften. Mit neueren Versionen von AngularJS, die Sie verwenden können$scope.$watchGroup
in Ihrer link-Funktion:Allerdings können Sie feststellen, dass die updates sind sehr langsam, wenn gerade die element-Eigenschaften direkt in dieser Art und Weise.
Machen Ihre Richtlinie reagiert, könnten Sie moderieren die refresh-rate durch die Verwendung von
$interval
. Hier ist ein Beispiel für eine Mehrweg-service für das ansehen von element-Größen in einem konfigurierbaren Millisekunde rate:Einer Richtlinie über solch ein service würde in etwa so Aussehen:
Beachten Sie den Aufruf
watcher.cancel()
im$scope.$destroy
event-handler; dies stellt sicher, dass die$interval
Instanz wird zerstört, wenn Sie nicht mehr benötigt.Einem JSFiddle-Beispiel finden Sie hier.
InformationsquelleAutor der Antwort SimonSparks
Hier ein Beispiel-code von dem, was Sie tun müssen:
InformationsquelleAutor der Antwort Eliel Haouzi
Der einzige Weg, Sie wäre in der Lage zu erkennen, Größe/position änderungen auf ein element über $Uhr ist, wenn Sie ständig aktualisiert und in Ihrem Umfang ist Sie so etwas wie $Intervall oder $timeout. Obwohl es möglich ist, es kann eine teure operation, und wirklich langsam Ihre app nach unten.
Einen Weg, den Sie erkennen konnte, dass die änderung auf ein element aufrufen
requestAnimationFrame
.Hier ein Plunk dies demonstrieren. Solange Sie in Bewegung sind die box um, bleibt es rot.
http://plnkr.co/edit/qiMJaeipE9DgFsYd0sfr?p=preview
InformationsquelleAutor der Antwort Blake Bowen
Einer leichten variation auf Eliel Antwort für mich gearbeitet. In der directive.js:
Nenne ich
innerhalb meiner app.js. Die Richtlinie d3 Diagramm wird nun die Größe, den container zu füllen.
InformationsquelleAutor der Antwort Matt Bearson
Hier ist mein nehmen auf dieser Richtlinie (mit
Webpack
als bundler):InformationsquelleAutor der Antwort Kamil