Вот как я решаю это с помощью строк.
public static string zee(string origString, int i)
{
string[] splitStr = origString.Split(' ');
string newStr = "";
// Not sure what you meant by wrap around but this should
// do the trick.
i %= splitStr.Length;
for (int j = (splitStr.Length - i); j < splitStr.Length; j++)
newStr += splitStr[j] + " "; // Add spaces taken by split :(
for (int j = 0; j < (splitStr.Length - i); j++)
newStr += splitStr[j] + " ";
return
newStr;
}
@ R.Richards прав: у вас не должно быть OnPush
в AppComponent
, потому что это корневой компонент вашего приложения, обнаружение изменений должно начинаться где-то, а AppComponent
- там, где это происходит. Чтобы ваш тест был более измеримым, вы должны иметь AppComponent
, ParentComponent
и ChildComponent
- все, кроме AppComponent
с ChangeDetection
, установленным на OnPush
.
Этот код:
this.childInput = {
time: new Date()
};
обновляет childInput
в классе AppComponent, но не в его шаблоне, поэтому вы никогда не обновите дочерний компонент @Input()
.
Если вы хотите, чтобы это работало, вам нужно добавить одну строку после обновления класса childInput
в AppComponent
, чтобы его шаблон получил новую привязку, которая затем будет передана дочернему компоненту. [1118 ]
this.childInput = {
time: new Date()
this.cd.detectChanges()
};
Обнаружение изменений не инициируется, потому что изменилось только значение в вашем входном объекте, а не сам объект.
Если у вас есть только простое свойство, лучше использовать его непосредственно в качестве входных данных (например, только время, а не объект, обертывающий время).
Если у вас есть объект и вам нужно только изменить свойство, вы можете работать с Object.assign ({}, NEW_OBJ), где NEW_OBJ - это ваш измененный объект с новым установленным временем. Таким образом, вы можете убедиться, что ссылка на объект изменяется и срабатывает changeDetection.
Посмотрите здесь . Особенно часть «Понимание изменчивости».
Обновление
Я сделал Stackblitz для вас, чтобы показать, что я имел в виду. Вам не нужно вызывать само changeDetection, если вы создаете новый объект для вашего ввода.