Angularjs 如何延迟工厂的实例化
我想定义一个简单的工厂,它将成为我的应用程序中给定资源的Angularjs 如何延迟工厂的实例化,angularjs,ionic-framework,ionic,Angularjs,Ionic Framework,Ionic,我想定义一个简单的工厂,它将成为我的应用程序中给定资源的$resource定义的入口点(比如Post)。问题是Post的URL取决于用户的组织,因此在用户登录之前实例化Post类(例如类似的URL)是没有意义的(甚至是不可能的)https://host.com/organizations/your-org/posts/:id) 依赖于Post的控制器都受登录保护,因此(理论上)可以定义Post,假设用户已经登录 然而,我发现在任何控制器签名中简单地要求Post,会在引导时初始化Post工厂 an
$resource
定义的入口点(比如Post
)。问题是Post
的URL取决于用户的组织,因此在用户登录之前实例化Post
类(例如类似的URL)是没有意义的(甚至是不可能的)https://host.com/organizations/your-org/posts/:id
)
依赖于Post
的控制器都受登录保护,因此(理论上)可以定义Post
,假设用户已经登录
然而,我发现在任何控制器签名中简单地要求Post
,会在引导时初始化Post
工厂
angular.module('myapp.services', [])
.factory("Post", function($resource, Auth, $localStorage){
return $resource(Auth.links.posts.href, {id: "@id"});
});
Auth.links
在登录后初始化,因此在用户注销时引导应用程序会导致错误,因为Auth.links
为空
我想到了两种方法来解决这个问题,但这两种方法都不是我真正感兴趣的:
Post
factory以返回承诺,该承诺将在您登录后立即解决。但是为什么要创建另一个回调呢Post
工厂设为存根,然后修改Auth.login()
方法,使其使用正确的定义覆盖Post
工厂。这似乎有点老套,不标准,而我已经做到了if
语句不正确,它将注销的用户默认为登录页面,这导致了整个混乱。
事实证明,这些东西确实是按预期的方式工作的,而我的问题是编码错误。Derp.我想在路由器中使用
resolve
是一个不错的选择。我觉得有点恶心,因为我不想把我工厂的名字改成PostFactory
或PostModelAndPromise
之类的名字,但这绝对是一个比我目前想到的其他东西更好的选择。在那篇文章中还有其他答案可能适用。一般来说,这个问题是关于尽快运行一些东西,就像在应用程序启动之前一样。我的问题是将工厂的实例化延迟到登录之后。类似但不幸的是,该问题中的答案似乎不适用于我您可以使用$injector:$injector.get(“$log”)手动初始化它;