Pregunta

Tengo un asunto muy específico con una directiva principio con ciertas letras (t, u, v, w, y, z).La directiva se utiliza en un select elemento y está mirando para ngOptions cambios.

Cuando ngOptions se rellena con los datos de una petición Ajax, y el nombre de la directiva comienza con una letra determinada, por ejemplo,w, el segundo reloj de devolución de llamada de incendios antes de la seleccione opciones han sido creados.Si el nombre de la directiva comienza con una letra (a, k, m, n) el segundo reloj de devolución de llamada se activa después de las opciones que se han creado.

He aquí una muestra con múltiples directivas a partir de diversas letras.Abrir la consola para ver el problema.

<select w-foo ng-model="bar" ng-options="o.name for o in options"></select>
app.controller("test", function ($scope, $timeout) {

    // Emulate ajaxed options
    $timeout(function () {
        $scope.options = [{
            name: "aaa",
            id: 1
        }, {
            name: "bbb",
            id: 2
        }, {
            name: "ccc",
            id: 3
        }];
    }, 500);

});

app.directive("wFoo", function () {
    return {
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            scope.$watch(attrs.ngOptions.replace(/.*in /, ""), function () {
                console.log("w-foo ngOptions changed", element.html());
            });
        }
    };
});

En el código anterior, element.html() contendrá una única vacío option en el primer reloj de devolución de llamada (la inicial de digerir) y también contendrá un único vacío option en la segunda digerir (cuando el Ajax es completa).

De dónde viene este comportamiento viene?

¿Fue útil?

Solución

Hay tres mecanismos de aquí que están involucradas en la que explica este comportamiento:

  1. Los vigilantes se ejecutan en el mismo orden que están registrados (ver el código de la $watch método()).

  2. El post-funciones de enlace se ejecutan en el orden inverso de su prioridad (consulte la documentación de la priority la propiedad).

  3. Directivas con la misma prioridad se ejecutan en un orden indefinido.La prioridad por defecto es 0, por lo que todos sus directivas personalizadas aquí tienen esta prioridad.Desde el select la directiva, como también una prioridad de 0, el orden de ejecución es indefinido.

    Como se observa, "no definido" es un poco excesivo, y en realidad el orden de ejecución es el orden alfabético (ver el $compile código):directivas con un nombre en el principio de que el diccionario tiene una prioridad más alta.Pero, en mi humilde opinión, ya que esto no es dicho explícitamente en la documentación, usted no puede confiar en este comportamiento.

Para resumir, aquí hay algunos casos de uso.Cada directiva registra un observador.

  Name  |  Priority  | Watcher order
--------+------------+--------------
A       | 100        | 3rd
B       | 0          | 2nd
C       | none (= 0) | 1st

Por lo tanto, para solucionar el problema es simple:

  • Si desea ejecutar el vigilante de sus directivas personalizadas después de el select uno, acaba de dar a su disposición una prioridad más alta que 0.
  • Si desea ejecutar el vigilante de sus directivas personalizadas antes de el select uno, bueno... desde negativa prioridad está prohibido, no se puede hacer de forma fiable que.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top