Обнаружение изменений не инициируется, потому что изменилось только значение в вашем входном объекте, а не сам объект.
Если у вас есть только простое свойство, лучше использовать его непосредственно в качестве входных данных (например, только время, а не объект, обертывающий время).
Если у вас есть объект и вам нужно только изменить свойство, вы можете работать с Object.assign ({}, NEW_OBJ), где NEW_OBJ - это ваш измененный объект с новым установленным временем. Таким образом, вы можете убедиться, что ссылка на объект изменяется и срабатывает changeDetection.
Посмотрите здесь . Особенно часть «Понимание изменчивости».
Обновление
Я сделал Stackblitz для вас, чтобы показать, что я имел в виду. Вам не нужно вызывать само changeDetection, если вы создаете новый объект для вашего ввода.
Чтобы подробно остановиться Грабят ответ Происпользования, необходимо объявить делегата и затем передать метод сопоставления в него.
В B:
public delegate void CallbackDelegate(string status);
public void DoWork(string param, CallbackDelegate callback)
{
callback("status");
}
В A:
public void MyCallback(string status)
{
// Update your UI.
}
И когда Вы называете метод:
B.DoWork("my params", MyCallback);
У Вас есть две опции. Наиболее распространенное должно иметь событие в B и иметь Ваш UI в A, подписываются на то событие. B затем запускает то событие.
Вторая опция состоит в том, чтобы передать в делегате от в качестве параметра к вызову метода в B. B может затем Вызвать того делегата.
Передача в объекте обратного вызова в вызове A делает к B. Используйте интерфейс (или плотно связанные библиотеки). Удостоверьтесь, что объект обратного вызова ориентирован на многопотоковое исполнение и ориентирован на многопотоковое исполнение.
Если Вы управляете B, то Грабите Происпользование, или ответы Brody будут хорошо работать.
Но что, если Вы не можете изменить B вообще? В этом случае можно всегда переносить метод в делегата собственного создания, поскольку долго это - соответствия подписи та из подписи целевого метода.
Так, скажите, что у Вас есть экземпляр класса по имени B с открытым методом, названным b () (от B dll блок, конечно). Класс A в приложение может назвать его асинхронно как это:
public class A
{
delegate void BDelegate();
public void BegineBMethod()
{
BDelegate b_method = new BDelegate(B.b);
b_method.BeginInvoke(BCallback, null);
}
void BCallback(IAsyncResult ar)
{
// cleanup/get return value/check exceptions here
}
}