2013-06-18 18 views
22

Vorrei impostare una promessa e poi lanciarla in una direttiva (usando il tipo di attributo databinding '=') e fare la magia then all'interno della direttiva, ma passando la promessa come attributo sembra portare a una promessa risolta come undefined, pertanto lo then (e qualsiasi altra funzionalità promessa) non è disponibile.Come passare promesse come attributi direttiva in Angular

risposta

15

ho il sospetto questo è dovuto a questo specifico Tweak:

promesse $ q sono riconosciuti dal motore di template in angolare, il che significa che nei modelli è possibile trattare le promesse collegate a un ambito come se fossero la valori risultanti - angular $q docs

e questo si traduce essenzialmente nella promessa di essere convertiti all'interno del modello per il valore $$v che la promessa utilizza per memorizzare il valore risultante, e nella fase di linking questo è probabile che sia ancora da definire - il valore convertito (cioè non definito), non la promessa stessa viene quindi passata nella direttiva.

La soluzione alternativa consiste nel non utilizzare la promessa stessa come attributo passato alla direttiva, ma per renderlo parte di un oggetto padre: l'oggetto padre non avrà la corsa del motore $ q/template, e così tu " Sarai in grado di approfondire la promessa del genitore e di accedere alla funzionalità then da lì.

Vedi http://jsfiddle.net/cebjyre/95sjT/ per esempio - linea decommentando 32 causerà un guasto dovuto la promessa di primo livello più effettivamente essere una promessa a quel punto, mentre la seconda promessa livello sulla linea 17 funziona bene

+1

Grazie. Questo dovrebbe essere selezionato come risposta corretta – manikanta

+0

Grazie per quella risposta utile. Questa è una brutta verruche su Angular però: gestisce il binding alle promesse in modo trasparente direttamente nella vista, ma non nei modelli. Così ora, anche se vuoi passare dati dritti, devi avvolgerlo in una promessa e un oggetto wrapper. E ora il mio modello di direttiva è pieno di bruttezza come '{{itemList.promise [indice]}}'. La direttiva non è semplicemente perfetta come vorrei. –

+6

da 1,2 promesse angolari non sono più riconosciuti dal motore dei modelli –

6

Grazie. Ho aggiunto questo a documenti angolari.

http://docs.angularjs.org/api/#comment-984109158

Per raggiungere questo obiettivo avvolgere la vostra promessa nel genitore: $ scope.myDirectiveAtrribute = {promessa: deferred.promise} e poi nel l'accesso direttiva la promessa

$ portata. myDirectiveAtrribute.promise.then (function() {});

+1

Grazie per la condivisione. La tua soluzione sta funzionando! – ValeriiVasin

+0

Ho anche usato questa strategia usando i componenti Angular 1.5. Ho usato angular.element (document) .ready() e poi ho avuto accesso alla promessa dal callback pronto. Probabilmente un caso d'uso per restare con le direttive invece dei componenti, ma funziona. – mbokil

Problemi correlati