如何在渲染视图后启动一个函数?我需要获得一些组件的测量宽度,但至少从navigatedTo
和loaded
事件访问时,所有内容都是0或NaN。
答案 0 :(得分:4)
确定建造和绘制物品的时间;我发现可靠工作的唯一方法实际上是使用类似的东西:
exports.onNavigatingTo = function() {
setTimeout(codeAfterRender, 1);
}
function codeAfterRender() {
/* do something cool */
}
原因是因为就像普通的应用程序一样,UI仍然只是一个单独的线程;所以当JS运行时;用户界面无法实际更新。
所以诀窍是推迟你的代码,直到JS引擎退出到本机代码之后;本机代码呈现屏幕,然后重新进入JS引擎。
因此,延迟代码的最简单方法是使用setTimeout,因为setTimeout是在本机代码中调度的。 (这非常类似于在Node中使用process.nextTick。)
事件循环:
只是为了一些额外的清晰度;关于事件循环如何工作,一个真实的例子;我为我的一个应用程序编写的一个帮助例程是这样的:
function updateProgress(msg) {
return new Promise((resolve) => {
statusLabel.text = msg;
setTimeout(resolve, 0);
});
}
所以我会做这种类型的代码。
UpdateProgress("Processing 1/3")
.then(function() {
/* do some work, work freezes UI, so break it up */
return UpdateProgress("Processing 2/3");
})
.then(function() {
/* do some more work, again work freezes UI */
return UpdateProgress("Processing 3/3");
})
.then(function() {
/* do some more work, again work freezes UI */
return ...
});
原因是因为当NativeScript仍然在eventloop的JavaScript部分时,显示不会更新;因此,如果您有大量工作要做,并且您仍希望显示响应,则需要退出事件循环的JavaScript部分;让Native部分处理任何待处理的消息,然后在JS部分中继续返回以进行下一部分处理。 (这也消除了Android上的ANR) - 所以诀窍是通过setTimeout处理Resolve
调用。
我也看到有些人使用on idle通知;但是在两个平台上为它设置事件要复杂一些;使用setTimeout
更简单,同样有效。
答案 1 :(得分:0)
你确定你正在使用" onNavigatedTo"而不是" onNavigatingTo" ?
这些都是page events。