如何强制更新ng-init?

时间:2018-05-02 15:09:26

标签: javascript angularjs

我发现更新rowIndex后没有更新ng-init。

<div ng-init="item = getItem(rowIndex)">
   {{ item.Name }} 
</div>
更改rowIndex后,

项不会更新(即使使用$ timeout进行更改)

是否有其他指令允许避免使用以下脏技巧:

<div ng-repeat="item in [getItem(rowIndex)]">
   {{ item.Name }} 
</div>

3 个答案:

答案 0 :(得分:3)

public void generateFixtures() { List<Match> fixtureMatches = new ArrayList<Match>(); for(int i = 1; i<=NUMBER_OF_FIXTURES; i++) { for(int j = 0; j<4; j+=2) { Random rand = new Random(); int t1 = rand.nextInt(15) + 0; int t2 = rand.nextInt(15) + 0; if(t2==t1) { t2 = rand.nextInt(15)+0; } SQLiteDatabase.insertInMatch(i, teams.get(t1).getTeamName(), teams.get(t2).getTeamName()); Match m = new Match(teams.get(t1), teams.get(t2)); fixtureMatches.add(m); } Fixture f = new Fixture(i, fixtureMatches); League.getInstance().fixtures.add(f); } } 未更新。这是一次性指令。你应该从大括号内调用这个函数,因为你想要注意对ngInit的更改:

rowIndex

这可能会影响大型列表的性能,因为<div> {{ getItem(rowIndex).Name }} </div> 将在每个摘要周期调用,但它很容易阅读。

https://plnkr.co/edit/cZ2SG6nf2SufdAWe1ye7?p=preview

答案 1 :(得分:2)

另一种方法是在虚假属性中设置变量:

<div x="{{item = getItem(rowIndex)}}">
    {{ item.Name }} {{item.Value}}
</div>

在每个摘要周期中,item的值将会更新。

item具有多个属性的情况下,getItem函数只需要调用一次。

请记住,当item更改而不是在每个摘要周期调用rowIndex函数时,控制器只更新一次getItem的值会更高效。 / p>

避免使用ng-init

避免使用ng-init。它纠缠了模型和视图,使代码难以理解,测试,调试和维护。而是在控制器中初始化模型。

来自文档:

  

ngInit

     
    

可以滥用此指令将不必要的逻辑量添加到模板中。 ngInit只有少数适​​当用途,例如对ngRepeat的特殊属性进行别名,如下面的演示所示;并通过服务器端脚本注入数据。除了这几种情况,您应该使用controllers而不是ngInit来初始化范围上的值。

  
     

— AngularJS ng-init Directive API Reference

答案 2 :(得分:-1)

基于你的问题标题,我会说这篇文章可能是另一个很好的资源,可以帮助你。 Angular有各种各样的生命周期钩子(这都是ngInit)。

我不确定你的项目的上下文,但听起来像ngDoCheck可能对你想要实现的目标有用。

  

ngDoCheck - 用于检测和处理Angular无法或不会自行检测的更改。

https://www.tutorialspoint.com/angular2/angular2_lifecycle_hooks.htm

希望这有帮助!