控制器中的ng-init与函数,使用$ parent时更好的做法?

时间:2015-05-15 02:43:24

标签: javascript angularjs twitter-bootstrap angularjs-scope angularjs-ng-repeat

我有一个Bootstrap模式,对应于ng-repeat列表。我想从其父节点访问ng-repeat范围数据,其中包含模态。我这样做,以便当在列表上单击模态按钮时,来自JSON的相应数据将出现在模态中。

我找到了两种方法,我想知道哪种方法最好?

方法1 视图:

<li ng-init="myFunction(item,$parent)" ng-repeat="item in data.webapps_1.items>

控制器:

 $scope.myFunction = function(item,parent){
        parent.selected=item.counter-1;
    };

方法2查看:

<li ng-init="$parent.selected=item.counter-1" ng-repeat="item in data.webapps_1.items>

控制器中没有任何内容。

我已在Angular ngInit文档中读到

  

ngInit的唯一合适用途是对特殊属性进行别名处理   ngRepeat的内容,如下面的演示所示。除了这种情况,你应该   使用控制器而不是ngInit来初始化作用域上的值。

但是ngRepeat的特殊属性列表不包括$ parent。

那么,这是更好的做法?在控制器或ngInit指令中包含表达式$parent.selected=item.counter-1

提前致谢

2 个答案:

答案 0 :(得分:1)

两个罚款中的任何一个真的,只要你一致。取决于应用程序的规模。

IMO如果应用程序规模很大,你会想要采用功能方式,更好地遵循整个MVC解耦和关注点分离的理念(http://victorblog.com/2013/03/18/angularjs-separation-of-concerns/)。

ng-init="myFunction(item,$parent)"

这是一个更好的结构,因为您希望将大部分业务逻辑保留在javascript控制器中,而不是视图中。

答案 1 :(得分:1)

就个人而言,我更喜欢ng-init方法。主要是为了保持通话时间的一致性(即更像是&#34; onLoad&#34;事件)。我理解对SoC的担忧,这也是有道理的。但是,我已经看到一些特定的场景(特别是包含大量指令的页面),当使用(非ng-init)函数中的= binding更改范围变量时,会导致额外的(过早的)摘要循环。显然这取决于你在函数中实际做了什么以及你的范围绑定,但在我看来,最好只是避免这种情况并全面使用ng-init指令。您的经历可能会发生很大变化。像其他人一样,只需选择一种方法并坚持下去,并了解您在功能本身中所做的每一次通话的影响。 :)

编辑:关于接受的答案,该示例用于将值传递给ng-init中的init函数。并且他正确认为这违反了模式。我通常使用无参数初始化函数,并将其称为:

ng-init="model.init()"

对$ scope的任何引用或者你将在函数内部发生什么。我很少将任何内容传递给init,除非它是静态值。例如,在ASP.NET WebApi项目的几个案例中,我希望最小化到服务器的往返,所以我将从MVC视图模型中解析一个值,它只是呈现并传递为字符串,如下所示:

ng-init="model.init(@model.myValue)"

在这些情况下,通常最好将它保持为简单的值类型(即字符串,整数等),但我偶尔会遇到一些小指令,例如除了显示下拉列表之外什么都不做,我已经将数组传递给了填充下拉列表绑定。这些情况非常具有情境性,特别是在使用模板的服务器端渲染时,这种情况显然会起作用。