NG-INIT与控制器中的功能,在使用$ parent时,这是更好的练习



我有一个引导模式,该模态与NG重复列表相对应。我想访问其父母的NG重复范围数据,其中包含模态。我这样做是这样,当单击列表上的模态按钮时,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

预先感谢

只要您保持一致,这两个罚款中的任何一个。不过取决于应用程序的规模。

imo如果应用程序很大,您将需要采用函数方式,以更好地遵守整个MVC的哲学哲学和关注点的分离(http://victorblog.com/2013/03/18/angularjs-separation of Concerns/).

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

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

就个人而言,我更喜欢ng-init方法。主要是为了使呼叫的时机保持一致性(即更像是" on Load"事件)。我了解有关SOC的担忧,这也很有意义。但是,当我在(非NG-INIT)功能中使用=绑定的范围变量时,我已经看到了一些特定的方案(尤其是具有很多指令的页面),引起了额外的(过早)摘要循环。显然,这取决于您在功能和范围绑定中实际在做什么,但我认为最好避免情况并全面使用NG-INIT指令。您的经验显然可能会有所不同。就像其他人所说的那样,只要选择一种方法并坚持下去,并意识到您在功能本身中进行的每个呼叫的影响。:)

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

ng-init="model.init()"

对$范围的任何引用或您在功能本身内会发生什么。除非它是静态价值,否则我很少将任何东西传递给初始化。例如,在ASP.NET WebAPI项目上的几种情况下,我希望最大程度地减少到服务器的往返行程,因此我将从MVC视图模型中解析一个值,MVC视图模型刚刚呈现并以类似的字符串传递:

ng-init="model.init(@model.myValue)"
在这种情况下填充下拉绑定。这些情况非常处境,特别是,显然只有在使用模板的服务器侧渲染时才能使用。

最新更新