2

在第一个示例代码中,一切都按预期工作 - 在每次页面路由更改时,我们检查一些条件 ( $timeout) 并解决一个承诺:

JSFiddle Var 示例代码

var rulesFactory在我们移动到的第二个示例中app.factory('rulesFactory'),现在它可以工作一次:

JSFiddle 应用工厂示例代码

是缓存吗?如何解决这个问题以提高代码的可重用性?

4

1 回答 1

7

您的代码rulesFactory只运行一次 - 第一次实例化服务本身。

它在第一次解决时这样做:

  1. Angular 发现它正在寻找可以注入的东西,称为“rulesFactory”
  2. Angular 找到了一个名为 rulesFactory 的服务。它看到还没有人使用 rulesFactory,并实例化服务。
  3. 服务 rulesFactory 被实例化,并且 $timeout 运行并返回一个承诺

它在第二次解析时这样做:

  1. Angular 发现它正在寻找“rulesFactory”。rulesFactory 已经存在!
  2. Angular 只是获取 rulesFactory 的现有对象。
  3. 之前的超时时间已经用完了,并且将使用相同的已经解决的承诺。

解决这个问题的方法是让 rulesFactory 返回一个函数,该函数将再次运行超时 - 每次你想要它的时候。

此外, $timeout 本身返回一个承诺,所以你可以只返回一个 $timeout :-)

http://jsfiddle.net/JbTkp/4/

于 2013-05-21T18:52:24.910 回答