Є кілька переваг використання функції для визначення вашої моделі перегляду.
Основна перевага полягає в тому, що у вас є негайний доступ до значення, this
яке дорівнює створеному екземпляру. Це означає, що ви можете:
var ViewModel = function(first, last) {
this.first = ko.observable(first);
this.last = ko.observable(last);
this.full = ko.computed(function() {
return this.first() + " " + this.last();
}, this);
};
Отже, обчислювані дані, які можна спостерігати, можуть бути прив'язані до відповідного значення this
, навіть якщо вони викликані з іншої області застосування.
З буквальним об'єктом, вам доведеться зробити:
var viewModel = {
first: ko.observable("Bob"),
last: ko.observable("Smith"),
};
viewModel.full = ko.computed(function() {
return this.first() + " " + this.last();
}, viewModel);
У цьому випадку ви можете використовувати viewModel
безпосередньо в обчислюваному спостережуваному, але він оцінюється негайно (за замовчуванням), так що ви не могли визначити його в об'єктному буквалі, як viewModel
це не визначено до закриття об'єкта буквалом. Багатьом людям не подобається, що створення вашої моделі перегляду не вкладається в один дзвінок.
Ще одна закономірність, яку ви можете використовувати для забезпечення того, що this
завжди доречно, - це встановити змінну у функції, рівну відповідному значенню, this
і використовувати її замість цього. Це було б так:
var ViewModel = function() {
var self = this;
this.items = ko.observableArray();
this.removeItem = function(item) {
self.items.remove(item);
}
};
Тепер, якщо ви знаходитесь у межах окремого елемента та дзвоніть $root.removeItem
, значенням this
фактично будуть дані, пов'язані на цьому рівні (який би був елемент). Використовуючи self в цьому випадку, ви можете переконатися, що воно вилучено із загальної моделі перегляду.
Іншим варіантом є використання bind
, яке підтримується сучасними браузерами та додається KO, якщо воно не підтримується. У такому випадку це виглядатиме так:
var ViewModel = function() {
this.items = ko.observableArray();
this.removeItem = function(item) {
this.items.remove(item);
}.bind(this);
};
На цю тему можна сказати набагато більше, і багато шаблонів, які ви могли б вивчити (наприклад, модель модуля та виявлення шаблону модуля), але в основному використання функції дає вам більше гнучкості та контролю над тим, як об’єкт створюється та можливість посилатися змінні, приватні для екземпляра.
prototype
(методи, які часто, наприклад, отримують дані з сервера та відповідно оновлюють модель перегляду). Однак ви все одно можете очевидно оголосити їх властивістю об'єкта буквально, тому я не можу бачити різниці.