Я хотел бы дать обещание, а затем бросить его в директиву (используя тип атрибута databinding '=') и сделать магию then
в директиве, но, по-видимому, передача обещания как атрибута в обещании, которое разрешено как undefined
, поэтому then
(и любая другая функциональность обещания) недоступна.
Как передать promises в качестве атрибутов директивы в Angular
Ответ 1
Я подозреваю, что это связано с этой конкретной настройкой:
$q promises распознаются движком шаблонов в angular, что означает, что в шаблонах вы можете рассматривать promises, прикрепленные к области видимости, как если бы они были результирующими значениями - angular $q docs
и это по существу приводит к тому, что обещание преобразуется внутри шаблона в значение $$v
, которое обещание использует для хранения результирующего значения, и на этапе компоновки это, вероятно, будет undefined - преобразованное значение ( т.е. undefined), а не само обещание передается в директиву.
Обходной путь заключается не в том, чтобы использовать само обещание как атрибут, переданный в директиву, а для того, чтобы сделать его частью родительского объекта: родительский объект не будет запускать мануал за $q/template, и поэтому вы будете иметь возможность свернуться с обещанием от родителя и получить доступ к функции then
оттуда.
См. http://jsfiddle.net/cebjyre/95sjT/ для примера - строка с неудовлетворением 32 приведет к сбою из-за обещания верхнего уровня, фактически не являющегося обещанием в этот момент, тогда как обещание второго уровня в строке 17 работает отлично
Ответ 2
Спасибо. Я добавил это в Angular docs.
http://docs.angularjs.org/api/#comment-984109158
Чтобы добиться этого, положите свое обещание в родителя: $scope.myDirectiveAtrribute = {обещание: отложенный.промисс}, а затем в директива доступа к обещанию
$scope.myDirectiveAtrribute.promise.then(функция() {});