小编Su-*_*ang的帖子

Angular2 + routeReuseStrategy生命周期钩子

我正在尝试利用自定义的RouteReuseStrategy ,为此,我想在分离组件时暂停任何订阅,以及滚动到正确位置等其他事情.

我已经检查了可能的钩子,但显然没有添加额外的生命周期钩子并且没有调用OnDestroy.

我试图添加自己的onDetach和onAttach挂钩,但无论是ActivatedRouteSnapshots也不DetachedRouteHandle会给我当前组件实例(只是原型?).

通过使用CanDeactivate后卫导航时,我可以抓住组件实例的唯一方法,但这似乎不对.我仍然找不到为onAttach添加钩子的方法.

所以我的问题是,如何在分离时正确暂停组件并在连接时恢复它?

曾经有一个OnActivate钩子接口@angular/router,但似乎已经消失,我没有看到任何替代品.

PS似乎有一些关于使用自定义RouteReuseStrategies的Angular应用程序在长时间使用时放慢速度的报告,可能是因为没有办法暂停/恢复组件.

angular-routing angular angular-router

7
推荐指数
1
解决办法
888
查看次数

LiveData双向数据绑定,不公开MutableLiveData

我正在尝试在EditText上使用双向数据绑定,如果我将该字段公开为MutableLiveData,则效果很好,因为通常在网上找到的示例中都可以看到它。

但是,有充分的理由不公开MutableLiveData,并且这些理由并不是神奇的无效,因为我决定使用数据绑定库。

编辑:这里的主要动机是MyViewModel应该保持对设置数据的控制(这是为什么不建议MutableLiveData直接公开它的原因),在设置方法中,我可以执行任何必要的检查或转换,然后仅调用setValueLiveData。

我通常会LiveData从ViewModel中公开一个getter和一个单独的setter,我试图通过使用InverseMethod()批注来实现双向数据绑定,但这并不能真正起作用,因为数据绑定正在寻找getValue()LiveData本身的InverseMethod。

这是一个简单的示例:

public class MyViewModel extends ViewModel {

    private MutableLiveData<String> mEmail = new MutableLiveData<>();

    // @InverseMethod("setEmail")    ### THIS DOESN'T WORK
    public LiveData<String> getEmail() {
        return mEmail;
    }

    // ### I WANT DATA-BINDING TO USE THIS METHOD
    public void setEmail(String email) {
        if (mEmail.getValue() != email) {
            mEmail.setValue(email);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是想要绑定它的方式

<EditText
   android:id="@+id/input_email"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:text="@={viewmodel.email}"/>
Run Code Online (Sandbox Code Playgroud)

到目前为止,唯一可行的解​​决方法是使用单向数据绑定在EditText上设置文本,然后附加TextWatcher并从此处调用我的ViewModel.setter。

编辑:
第二种解决方法是扩展MutableLiveData,然后在重写中进行检查和转换setValue...这是要编写的很多样板文件。

android android-databinding android-livedata android-architecture-components

6
推荐指数
2
解决办法
559
查看次数

MySQL Workbench 无法与 Google Cloud SQL 代理配合使用

我正在使用 Google Cloud SQL 第二代,并在本地计算机上安装了cloud-sql-proxy 。

在我的本地计算机上,我只需连接到 127.0.0.1:3306,并且在 NodeJs、Php 和使用 mysql 命令行客户端中运行良好。

在 Google App Engine 托管 VM(灵活环境)上,我使用 unix_socket 或 socketPath '/cloudsql/MY_PROJECT_ID:us-central1:SQL_INSTANCE' 这在 Php 和 NodeJs 中也运行良好。

MySQL Workbench 不起作用,我不知道如何连接它。它是否使用其他协议或者 cloud-sql-proxy 仅用于命令行?

这是我启动 cloud-sql-proxy 的方法

这有效:

./cloud_sql_proxy \
  -instances=MY_PROJECT:us-central1:MY_SQL_INSTANCE=tcp:3306 \
  -credential_file='/Users/ME/SomeFolder/MY_SERVICE_ACC_KEY.json'
Run Code Online (Sandbox Code Playgroud)

之后我使用 MySQL Workbench 尝试连接到 127.0.0.1:3306,但总是收到错误:

SSL connection error: socket layer receive error
Run Code Online (Sandbox Code Playgroud)

本地 PHP、NodeJS 和 mysql 客户端也可以工作。

任何帮助,将不胜感激

mysql-workbench google-cloud-sql cloud-sql-proxy

3
推荐指数
1
解决办法
2657
查看次数