稍后添加控制器

时间:2013-01-22 01:59:20

标签: angularjs socketstream

我正在尝试创建一个可以动态启用/禁用部件的NG应用。我们的想法是拥有一个" admin"页面,可以启用或禁用部分应用程序,然后看到新功能以页面顶部的调整菜单的形式出现,以及加载到应用程序中的匹配路线,控制器等(I' m使用SocketStream w / NG)。

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

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

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

问题在于注册控制器。我用正确的args调用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"然后"安装"。顶部菜单将更新为新的" Sandbox"条目。单击该条目会生成上面显示的错误。

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

1 个答案:

答案 0 :(得分:0)

答案结果是双重的:

  • NG调用来自SocketStream RPC回调,并且必须包含在$ scope中。$ apply calls - 我的不好,不知道这个SS / NG交互
  • @ matys84pl概述了解决方案的其余部分 - 尽早选择$ controllerProvider(和$ filterProvider),这样可以在以后调用它们而不是正常的“app.controller”和“app.filter”成员,以后似乎不再工作了

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

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