Comme @Nenad les avis, les promesses ne sont plus automatiquement déréférencé. C'est l'un des plus bizarres les décisions que j'ai jamais vu, car il silencieusement supprime une fonction que j'ai invoqué (et qui a été l'un des points de vente uniques angulaire pour moi, le moins est le mieux). Donc il m'a fallu un peu de temps pour comprendre cela. Surtout depuis le $cadre de ressources semble toujours bien fonctionner. Sur le dessus de tout cela, c'est aussi une release candidate. Si ils ont vraiment eu de déprécier ce (les arguments de son très faible), ils pourraient au moins avoir donné un délai de grâce où il y avait des avertissements avant silencieusement l'éteindre. Bien que généralement très impressionné par angulaire, c'est un gros moins. Je ne serais pas surpris si cela sera revenue, même si il semble y avoir relativement peu de protestations jusqu'à présent.
De toute façon. Quelles sont les solutions?
-
Toujours utiliser l'époque(), et d'attribuer le $champ d'application de la méthode
function Ctrl($scope) {
foo().then( function(d) { $scope.d = d; });
)
-
appel de la valeur grâce à une déballer fonction. Cette fonction retourne un champ dans la promesse et définit ce champ par le biais de la méthode. Il sera donc indéfini tant que la promesse n'est pas résolu.
$rootScope.unwrap = function (v) {
if (v && v.then) {
var p = v;
if (!('$$v' in v)) {
p.$$v = undefined;
p.then(function(val) { p.$$v = val; });
}
v = v.$$v;
}
return v;
};
Vous pouvez maintenant appeler:
Hello {{ unwrap(world) }}.
C'est à partir de http://plnkr.co/edit/Fn7z3g?p=preview qui n'a pas un nom qui lui est associée.
Ensemble $parseProvider.unwrapPromises(true)
et de vivre avec les messages, vous pouvez éteindre avec $parseProvider.logPromiseWarnings(false)
mais il est préférable d'être conscients qu'ils pourraient retirer de la fonctionnalité dans une prochaine version.
Soupir, 40 ans, Smalltalk eu l' become
message qui vous a permis de basculer les références de l'objet. Des promesses qu'ils pourraient l'avoir été ...
Mise à JOUR:
Après changement de mon application, j'ai trouvé un modèle général qui a fonctionné assez bien.
En supposant que j'ai besoin de l'objet 'x', et c'est un moyen d'obtenir cet objet à distance. Je vais donc d'abord vérifier un cache pour 'x'. Si il y a un objet, je le retourner. Si aucun objet n'existe, j'ai créer un véritable objet vide. Malheureusement, cela vous oblige à savoir si ce sera un Tableau ou une table de hachage/objet. J'ai mis cet objet dans le cache afin que les futurs appels de pouvoir l'utiliser. Je puis commencer à l'appel distant et sur le rappel je copie les données obtenues à partir du système à distance à l'objet créé. Le cache s'assure que les appels répétés à la méthode get ne sont pas la création de beaucoup d'appels à distance pour le même objet.
function getX() {
var x = cache.get('x');
if ( x == undefined) {
cache.put('x', x={});
remote.getX().then( function(d) { angular.copy(d,x); } );
}
return x;
}
Pourtant, une autre alternative est de fournir la méthode get avec la destination de l'objet:
function getX(scope,name) {
remote.getX().then( function(d) {
scope[name] = d;
} );
}