Обнаружение изменений OnPush не работает с новой ссылкой на входе дочернего компонента

Вот как я решаю это с помощью строк.

    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;
    }
0
задан Yashwardhan Pauranik 18 January 2019 в 11:32
поделиться

2 ответа

@ 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()
};  
0
ответ дан codeepic 18 January 2019 в 11:32
поделиться

Обнаружение изменений не инициируется, потому что изменилось только значение в вашем входном объекте, а не сам объект.

Если у вас есть только простое свойство, лучше использовать его непосредственно в качестве входных данных (например, только время, а не объект, обертывающий время).

Если у вас есть объект и вам нужно только изменить свойство, вы можете работать с Object.assign ({}, NEW_OBJ), где NEW_OBJ - это ваш измененный объект с новым установленным временем. Таким образом, вы можете убедиться, что ссылка на объект изменяется и срабатывает changeDetection.

Посмотрите здесь . Особенно часть «Понимание изменчивости».

Обновление

Я сделал Stackblitz для вас, чтобы показать, что я имел в виду. Вам не нужно вызывать само changeDetection, если вы создаете новый объект для вашего ввода.

Stackblitz

0
ответ дан Erbsenkoenig 18 January 2019 в 11:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: