Events 在NativeScript上呈现视图时发生的事件

Events 在NativeScript上呈现视图时发生的事件,events,view,interface,render,nativescript,Events,View,Interface,Render,Nativescript,渲染视图后如何启动函数?例如,我需要获得某个组件的测量宽度,但至少当从navigatedTo访问并加载事件时,所有内容都是0或NaN 您确定使用的是onNavigatedTo而不是OnNavigationTo吗 这些都是。您确定使用的是onNavigatedTo,而不是OnNavigationTo吗 这些都是。对构建和绘制事物的时间有影响;我发现唯一可靠工作的方法实际上是使用以下方法: exports.onNavigatingTo = function() { setTimeout(code

渲染视图后如何启动函数?例如,我需要获得某个组件的测量宽度,但至少当从navigatedTo访问并加载事件时,所有内容都是0或NaN

您确定使用的是onNavigatedTo而不是OnNavigationTo吗


这些都是。

您确定使用的是onNavigatedTo,而不是OnNavigationTo吗


这些都是。

对构建和绘制事物的时间有影响;我发现唯一可靠工作的方法实际上是使用以下方法:

exports.onNavigatingTo = function() {
  setTimeout(codeAfterRender, 1);
}

function codeAfterRender() {
/* do something cool */
}
原因是,就像一个普通的应用程序一样,UI仍然只是一个线程;所以当JS运行时;用户界面实际上无法更新

因此,诀窍是在JS引擎退出并返回到本机代码之前停止编写代码;本机代码呈现屏幕,然后重新进入JS引擎

因此,延迟代码的最简单方法是使用setTimeout,因为setTimeout是在本机代码中安排的。这非常类似于在节点中使用process.nextTick

事件循环:

JavaScript代码 JavaScript代码->您计划超时,这实际上是在本机中计划的 JavaScript代码完成所有执行 JavaScript运行时返回到本机代码 本机代码呈现并处理剩余的所有消息。 本机代码计时器触发,通过setTimeout函数启动JS引擎 JavaScript代码启动setTimeout例程 JavaScript代码完成,退出并返回NativeCode 本机代码呈现并处理剩余的所有消息 本机代码处于空闲状态。 只是为了更清楚一些;关于事件循环如何工作,一个真实的例子;我为我的一个应用程序编写的一个助手例程如下:

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部分;让本机部件处理任何挂起的消息,然后在JS部件中恢复,以进行下一部分处理。这也消除了安卓系统上的ANR——因此诀窍是通过setTimeout处理解析调用


我还看到一些人使用on-idle通知;但是,在两个平台上设置事件要复杂一些;使用setTimeout更简单,也同样有效

对事物建造和绘制的时间进行调整;我发现唯一可靠工作的方法实际上是使用以下方法:

exports.onNavigatingTo = function() {
  setTimeout(codeAfterRender, 1);
}

function codeAfterRender() {
/* do something cool */
}
原因是,就像一个普通的应用程序一样,UI仍然只是一个线程;所以当JS运行时;用户界面实际上无法更新

因此,诀窍是在JS引擎退出并返回到本机代码之前停止编写代码;本机代码呈现屏幕,然后重新进入JS引擎

因此,延迟代码的最简单方法是使用setTimeout,因为setTimeout是在本机代码中安排的。这非常类似于在节点中使用process.nextTick

事件循环:

JavaScript代码 JavaScript代码->您计划超时,这实际上是在本机中计划的 JavaScript代码完成所有执行 JavaScript运行时返回到本机代码 本机代码呈现并处理剩余的所有消息。 本机代码计时器触发,通过setTimeout函数启动JS引擎 JavaScript代码启动setTimeout例程 JavaScript代码完成,退出并返回NativeCode 本机代码呈现并处理剩余的所有消息 本机代码处于空闲状态。 只是为了更清楚一些;关于事件循环如何工作,一个真实的例子;我为我的一个应用程序编写的一个助手例程如下:

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部分;让本机部件处理任何挂起的消息,然后在JS部件中恢复,以进行下一部分处理。这也消除了安卓系统上的ANR——因此诀窍是通过setTimeout处理解析调用


我还看到一些人使用on-idle通知;但是,在两个平台上设置事件要复杂一些;使用setTimeout更简单,也同样有效

检查,是的,我正在使用它。检查,是的,我正在使用它。提供您试图实现的实际代码。您可以使用设置超时为1毫秒的计时器。这段代码将在执行/呈现所有代码后执行。我正在尝试获取视图维度,但还没有太多代码。我将尝试一下计时器延迟的想法。提供您试图实现的实际代码您可以使用设置超时为1毫秒的计时器。此代码将在所有代码之后执行
正在执行/呈现。我正在尝试获取视图维度,但代码还不多。我会尝试一下计时器延迟的想法。谢谢你的详细回答!这是否意味着setTimeoutcodeAfterRender为0;同样有效吗?是的,0也有效。不会真的有什么区别,当你放弃工作时,0或1毫秒是相同的;当JS引擎退出并转到本机时;您至少使用了1毫秒;-我喜欢1而不是0的唯一原因是为了防止有人在setTimeout monkeypatch或运行时中使用falsy测试;我的代码仍将继续运行。可能是非常遥远的可能性;但我总是在我的赌注上做对冲-我个人认为我更喜欢setTimeoutcodeAfterRender,0;,因此,代码的意图对读者来说更加清楚——这不是用来引入故意延迟的。谢谢你的回答!谢谢你的详细回答!这是否意味着setTimeoutcodeAfterRender为0;同样有效吗?是的,0也有效。不会真的有什么区别,当你放弃工作时,0或1毫秒是相同的;当JS引擎退出并转到本机时;您至少使用了1毫秒;-我喜欢1而不是0的唯一原因是为了防止有人在setTimeout monkeypatch或运行时中使用falsy测试;我的代码仍将继续运行。可能是非常遥远的可能性;但我总是在我的赌注上做对冲-我个人认为我更喜欢setTimeoutcodeAfterRender,0;,因此,代码的意图对读者来说更加清楚——这不是用来引入故意延迟的。谢谢你的回答!