如何在Promular中将promises作为指令属性传递

时间:2013-06-18 02:18:27

标签: angularjs angularjs-directive

我想设置一个promise然后将它抛入一个指令(使用数据绑定'='属性类型)并在指令中执行then魔术,但是将promise作为属性传递似乎导致承诺被解析为undefined,因此then(和任何其他承诺功能)不可用。

2 个答案:

答案 0 :(得分:16)

我怀疑这是由于这个特定的调整:

  

$ q promises被角度模板引擎识别,这意味着在模板中,您可以处理附加到范围的promise,就像它们是结果值一样    - angular $q docs

这实际上导致承诺在模板中转换为promise用于存储结果值的$$v值,并且在链接阶段,这可能仍未定义 - 转换后的值(即undefined),然后将promise本身传递给指令。

解决方法是不使用promise本身作为传递给指令的属性,而是使其成为父对象的一部分:父对象不会有$ q / template engine magic run,所以你会能够深入了解来自父级的承诺并从那里访问then功能。

请参阅http://jsfiddle.net/cebjyre/95sjT/作为示例 - 取消注释第32行将导致失败,因为顶级承诺不再实际上是该点的承诺,而第17行的第二级承诺正常工作

答案 1 :(得分:6)

感谢。我已将此添加到Angular文档中。

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

  

要实现这一点,请在父母中包装您的承诺:   $ scope.myDirectiveAtrribute = {promise:deferred.promise}然后进入   该指令访问承诺

     

$ scope.myDirectiveAtrribute.promise.then(函数(){});