角度:带有副作用的设置器输入

时间:2018-09-26 22:13:17

标签: angular

我正在阅读有角度的文档。这使我对以下句子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)
            }

1 个答案:

答案 0 :(得分:0)

  

“模板表达式的求值应该没有可见的一面   效果...”

这意味着,即您在模板中使用了某些东西,即您使用的事实,不应有任何副作用,例如执行请求,更改数据模型,修改dom等,更改某些属性。

最后一种情况可能很烦人且难以调试,因为在以下情况下会出现ValueChangedAfterCheckedException错误,例如,每次使用某种getter方法(模板中也使用该方法)时都会增加一些计数器。

现在就您的发言:

  

具有输入设置器的组件不得允许设置器具有   可见的副作用

取决于具体情况-通常不会有问题,因为@Inputs在初始化目标组件/对其进行检测之前就已进行了评估和绑定,因此可以更改组件状态。

因此,在您的情况下,一切都会很好,因为setter将在组件的更改检测/呈现之前运行。否则-它会退回到“无副作用”的一般规则。

如果仔细观察,您会发现onChanges(涉及@ input / @ output时会调用)是角度分量的第一生命周期回调。 (甚至在onInit回调之前)。这样就可以进行修改-并且在此之前调用setter。