1

我正在尝试创建一个可以动态启用/禁用部分的 NG 应用程序。这个想法是有一个“管理”页面,可以启用或禁用应用程序的某些部分,然后看到新功能以页面顶部调整菜单的形式出现,并匹配路由、控制器等加载到应用程序中(我正在使用带有 NG 的 SocketStream)。

第一步是动态添加/删除路由,为此我在https://stackoverflow.com/a/13173667找到了一个解决方案- 据我所知,效果很好。

接下来,将项目添加到菜单栏 - 在 ul/li 项目上使用 ng-repeat 很容易。

因此应用程序调整其菜单并识别相应的路线。到目前为止,一切都很好。

问题来自注册控制器。我myApp.controller('SandboxCtrl',[...])使用正确的参数调用(与启动时静态初始化时的工作相同),但控制器似乎没有正确加载或初始化。导航到新添加的路由会产生错误,例如:

Error: Argument 'SandboxCtrl' is not a function, got undefined
assertArg@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:973
assertArgFn@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:984
@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:4638
update@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:14007
$broadcast@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:8098
@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:7258
wrappedCallback@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:6658
wrappedCallback@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:6658
@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:6695
$eval@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:7848
$digest@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:7713
$apply@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:7934
@http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.js:5433

我目前不知道如何进行。我一直无法在网上找到解决方案。该应用程序太大而无法放入 jsFiddle,但如果需要,我可以在 GitHub 上提交最后的更改。

问题:这可行吗?我该怎么做才能调试这个?有什么我可以看的例子吗?

编辑:代码现在位于https://github.com/jcw/housemon(需要 node/npm/redis)。重现问题很容易:使用“npm start”启动,浏览到 localhost:3333,进入管理选项卡,单击“jcw-sandbox”,然后单击“安装”。顶部菜单将更新为新的“沙盒”条目。单击该条目会生成上面显示的错误。

哦,差点忘了:相关代码在 client/code/app/main.coffee 和 client/code/modules/routes.coffee ...

4

1 回答 1

0

答案原来是两方面的:

  • NG 调用是通过 SocketStream RPC 回调进行的,并且必须包含在 $scope.$apply 调用中——我的错,不知道这种 SS/NG 交互
  • @matys84pl 概述了解决方案的其余部分 - 尽早获取 $controllerProvider(和 $filterProvider),以便稍后调用它们而不是普通的“app.controller”和“app.filter”成员,其中以后似乎不再工作了

GitHub 中的示例代码,我将链接到特定的提交,以便此答案保持有效:

https://github.com/jcw/housemon/commit/f199ff70e3000dbf57836f0cbcbb3306c31279de

于 2013-01-23T01:14:58.483 回答