Estoy trabajando con angularjs y quiero cargar directivas cuando las necesiten, en lugar de cargarlas todas al principio de la página. Estoy intentando crear directivas para mis complementos utilizados con mayor frecuencia.¿Cómo pueden las directivas cargarse en perezoso en angularjs?
De esta manera, uno directo puede usar yepnope
para cargar todas las directivas necesarias antes de finalmente compilar el html.
Si la directiva se carga al inicio de la página con los demás, todo funciona bien. Sin embargo, si la directiva 'hijo' se carga más tarde (dentro del 'padre'), no tendrá efecto. A continuación se muestra el código para el campo pre en el campo de compilación de la directiva 'parent'.
...
var pre = function (scope, element, attrs) {
element.html('Please wait. Loading...');
ang.loadDirectives('caiDatePicker', function() {
console.log('loaded');
scope.data.raw = scope.rawData;
var html = createObjUi(scope, scope.data, scope.defn);
element.html(html); //data
$compile(element.contents())(scope.$new());
scope.$apply();
});
};
return { restrict:'A', compile: {pre:pre,post:function(){...}};
ang.loadDirectives
cargas de la directiva utilizando yepnope. Parte del código para la directiva 'hijo' es el siguiente:
angular.module('mycomponents') //PS: I'm assuming this will fetch the already created module in the 'parent' directive
.directive('caiDatePicker', function ($parse) {
return {
scope: {},
restrict: 'A',
link: function (scope, element, attrs) {
scope.$watch('this.$parent.editing', function (v) {
scope.editing = v;
});
yepnope({
test: $().datePicker,
nope: [
'/content/plugins/datepicker/datepicker.js', //todo: use the loader
'/content/plugins/datepicker/datepicker.css'
],
complete: function() {
if (scope.model && scope.model.value) {
var date = scope.model.value;
element.val(date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear());
}
element.datepicker({ weekStart: 1, format: 'dd/mm/yyyy' })
.on('changeDate', function (ev) {
scope.model.value = ev.date;
scope.$apply();
});
}
});
attrs.$observe('path', function (v) {
var fn = $parse(v);
var model = fn(scope.$parent);
scope.model = model;
});
}
}
});
¿Es lo que estoy haciendo incluso posible en primer lugar?
Si es así, ¿qué estoy haciendo mal?
enfoque interesante usando bootstrap en el niño. pero esto significa, múltiples bootstraps. ¿Funcionaría? también, ¿podrías explicar lo que hiciste en las ang.loadDirectives? – Lior
para arreglar su problema yepnope puede seguir el primer ejemplo de este comentario: https://github.com/SlexAxton/yepnope.js/issues/91#issuecomment-14526165 – heralight