1

我正在使用 ui-select 创建具有多个视图的复杂页面。对于那些不知道当用户选择一个选项卡(或者在我的情况下是一个下拉菜单)时每个视图都是通过 ajax 加载的人。传统上,视图有自己的控制器和 html 模板。视图继承了它们所在的父页面的范围,但有自己的子范围。

就我而言,我们的一些视图根本没有控制器。它们非常简单,我们只有它们的 html 页面。问题是我希望他们能够在父页面范围内的配置对象上切换布尔值,以关闭父页面上的某些控制字段。一切都已经存在,多个页面使用这些视图,我只是想扩展它们以在父级上切换某些内容。

我可以通过三种方式做到这一点。我可以在我的 ui-router 中使用 resolve 方法在加载视图时显式切换我想要的字段,但是我必须在每个 ui-router 中显式地为每个页面执行此操作;没有很酷的代码重用。

我可以让我的 ui-router 加载一个控制器,目前我没有控制器,而控制器可以做到这一点。然而,这意味着手动添加一个在我使用视图的任何地方都不需要的控制器,并且再次感觉不像代码重用。

或者我可以使用 ng-init 让我的视图在加载时明确设置我想要的值。对我来说,这感觉最干净、最简单,因为我还没有控制器。

但是, ng-init 不受欢迎,应该只用于别名。然后使用 ng-init 是否有更清洁的方法?没有控制器的视图真的很糟糕吗(更准确地说,他们仍然有父控制器,但是在打开新视图时不会重新加载)。

4

2 回答 2

3

您没有为路由指定控制器这一事实不会改变任何事情。视图有自己的范围,因此可以使用路由控制器或没有自己范围的指令(例如 ngInit)来操作它。

关于 ngInit 的知名评论的目标

ngInit 唯一合适的用途是为 ngRepeat 的特殊属性设置别名,如下面的演示所示。除了这种情况,您应该使用控制器而不是 ngInit 来初始化作用域上的值

是让你远离'html编程'。而且它没有太多意义,因为关注点分离不是 Angular 的优点。Angular 从 html 属性评估代码的习惯以及核心指令如何使用它的方式促使您进一步挑战它。

于 2015-04-21T22:14:53.687 回答
0

只是根本不初始化那些变量。ng-show="smth", ng-if="smth" 如果 'smth' 没有定义就可以正常工作,然后你使用 ng-click="smth = !smth" 改变它。

于 2015-04-21T18:24:10.413 回答