我正在阅读有角度的文档。这使我对以下句子REF
产生了疑问“模板表达式的求值应该没有可见的一面 效果...”
如果我理解正确,那是因为 “单个检测周期”执行“模板表达式”: 如果该模板表达式更改了呈现视图所依赖的信息, 它不会在该检测周期内显示更改 ...
我的疑问是:出于同样的原因, 可以肯定地说
具有输入设置器的组件不得允许设置器具有 可见的副作用
示例
可能导致以下结果:将输入传递给组件时,“列表”无法正确呈现
searchTextObservable
// Means start a new async search every time text is changed
.flatMapSingle { Single
.fromCallable { cheeseSearchEngine.search(it) }
// This makes sure search is running on IO thread
// This way expensive operation is done off the main thread, which eliminates the freeze
.subscribeOn(Schedulers.io()) }
// This makes sure that results will be handled on main thread
// Important because you can only access Android Widgets from the main thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
showResult(it)
}
答案 0 :(得分:0)
“模板表达式的求值应该没有可见的一面 效果...”
这意味着,即您在模板中使用了某些东西,即您使用的事实,不应有任何副作用,例如执行请求,更改数据模型,修改dom等,更改某些属性。
最后一种情况可能很烦人且难以调试,因为在以下情况下会出现ValueChangedAfterCheckedException
错误,例如,每次使用某种getter方法(模板中也使用该方法)时都会增加一些计数器。
现在就您的发言:
具有输入设置器的组件不得允许设置器具有 可见的副作用
取决于具体情况-通常不会有问题,因为@Inputs在初始化目标组件/对其进行检测之前就已进行了评估和绑定,因此可以更改组件状态。
因此,在您的情况下,一切都会很好,因为setter将在组件的更改检测/呈现之前运行。否则-它会退回到“无副作用”的一般规则。
如果仔细观察,您会发现onChanges
(涉及@ input / @ output时会调用)是角度分量的第一生命周期回调。 (甚至在onInit
回调之前)。这样就可以进行修改-并且在此之前调用setter。