我发现更新rowIndex后没有更新ng-init。
<div ng-init="item = getItem(rowIndex)">
{{ item.Name }}
</div>
更改rowIndex后,项不会更新(即使使用$ timeout进行更改)
是否有其他指令允许避免使用以下脏技巧:
<div ng-repeat="item in [getItem(rowIndex)]">
{{ item.Name }}
</div>
答案 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>
将在每个摘要周期调用,但它很容易阅读。
答案 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
来初始化范围上的值。
答案 2 :(得分:-1)
基于你的问题标题,我会说这篇文章可能是另一个很好的资源,可以帮助你。 Angular有各种各样的生命周期钩子(这都是ngInit)。
我不确定你的项目的上下文,但听起来像ngDoCheck可能对你想要实现的目标有用。
ngDoCheck - 用于检测和处理Angular无法或不会自行检测的更改。
https://www.tutorialspoint.com/angular2/angular2_lifecycle_hooks.htm
希望这有帮助!