2017-02-22 6 views
2

После борьбы с моей проблемой в this question, я обнаружил, что я могу инициализировать наблюдаемым с пустым объектом:Было бы больно инициализировать ВСЕ ko.observables?

abc = ko.observable({}); 

Старая мудрость, обратно из Fortran и т.д., есть это, что вы всегда должны инициализировать переменные , поэтому я теперь склонен инициализировать ВСЕ ko.observables. Это НЕ то, что я читал в учебниках на сайте нокаута. Поэтому мой вопрос: должен ли я только инициализировать, где это строго необходимо, или нет ухудшения производительности, если я делаю это везде?

ответ

4

Не думаю, что вам следует беспокоиться о производительности. Вы должны беспокоиться о читаемом коде, значимых начальных значениях и коде без ошибок.

Часто вы видите значения по умолчанию, которые используются для облегчения жизни разработчика. Например:

this.userInput = ko.observable(""); 
this.upperCaseUserInput = ko.computed(function() { 
    return this.userInput().toUpperCase(); 
}, this); 

Инициализация с пустой строкой позволяет пропустить проверку null/undefined в нашей вычислен. Если мы знаем, что мы свяжемся с input через привязку value, мы можем почти быть уверенным, что в прототипе нашего ввода всегда будет метод toUpperCase. Инициализация userInput с пустым объектом не принесет нам никакой пользы здесь: отсутствие функции с именем toUpperCase вызовет ошибку.

Если вы имеете дело со сложными вычислениями и «обнуляемыми» наблюдаемыми объектами, я думаю, что лучший способ - включить в ваши расчеты null и ввести «многоуровневые»/безопасные вычисления, где это возможно. Например:

this.selectedPerson = ko.observable(); // Can be null, undefined or Person 

// This computed is *always* a string 
var fullName = ko.pureComputed(function() { 
    var person = this.selectedPerson(); 

    return person 
    ? person.firstName + " " + person.lastName 
    : "Unknown person"; 
}, this); 

// So in this computed, we don't have to do any null checks 
this.displayName = ko.pureComputed(function() { 
    return "**" + fullName() + "**"; 
}, this); 

Если вы хотите абсолютную безопасность типа, я бы предложил обратиться к TypeScript. Комбинация TypeScript-knockout позволит вам определять наблюдаемые объекты, которые могут содержать только определенный тип значения, сводя к минимуму виды ошибок, с которыми вы столкнулись в другом вопросе.

Примечание: Я не уверен, что этот ответ слишком основан на мнениях ... Если вы это чувствуете, дайте мне знать. Вопрос может быть вне темы/слишком широким для stackoverflow ...

+0

Я думаю, что это прекрасный ответ. И пример человека хороший - если его никто не выбрал, нет смысла инициализировать его пустым объектом - тогда вы возвращаетесь к необходимости проверки наличия или отсутствия свойств. Лучше иметь «ничего», то есть «нуль», не представляющий ничего выбранного. В других случаях полезно использовать значение по умолчанию. Это действительно зависит от варианта использования, но я бы не сказал «да, это хорошая идея, чтобы инициализировать все ваши наблюдаемые». –

+0

Я узнал, что предложенная инициализация не всегда полезна или достаточна. В любом случае, спасибо за ваш ответ, я буду изучать его завтра. – Roland

+0

Ваш ответ, несомненно, помог мне лучше понять, что возможно с помощью Knockout, а что нет, и способы борьбы с нулевыми значениями. – Roland

Смежные вопросы