В нокауте js я вижу View Models, объявленные как:
var viewModel = {
firstname: ko.observable("Bob")
};
ko.applyBindings(viewModel );
или:
var viewModel = function() {
this.firstname= ko.observable("Bob");
};
ko.applyBindings(new viewModel ());
В чем разница между двумя, если таковые имеются?
Я нашел это обсуждение в группе Google knockoutjs, но оно не дало мне удовлетворительного ответа.
Я вижу причину, если я хотел инициализировать модель с некоторыми данными, например:
var viewModel = function(person) {
this.firstname= ko.observable(person.firstname);
};
var person = ... ;
ko.applyBindings(new viewModel(person));
Но если я не занимаюсь этим, имеет ли значение, какой стиль я выберу?
prototype
(методы, которые часто, например, выбирают данные с сервера и соответственно обновляют модель представления). Однако вы все равно можете объявить их как свойство литерала объекта, поэтому я не вижу разницы.Ответы:
Есть несколько преимуществ использования функции для определения модели представления.
Основным преимуществом является то, что у вас есть немедленный доступ к значению
this
, равному создаваемому экземпляру. Это означает, что вы можете сделать:Таким образом, ваша вычисляемая наблюдаемая может быть связана с соответствующим значением
this
, даже если она вызывается из другой области видимости.С литералом объекта вы должны сделать:
В этом случае вы можете использовать
viewModel
непосредственно в вычисляемой наблюдаемой, но она оценивается немедленно (по умолчанию), поэтому вы не можете определить ее в литерале объекта, какviewModel
это не определено до тех пор, пока литерал объекта не будет закрыт. Многим людям не нравится, что создание вашей модели представления не заключено в один вызов.Другой шаблон, который вы можете использовать, чтобы убедиться, что
this
он всегда уместен, - установить переменную в функции равной соответствующему значениюthis
и использовать ее вместо этого. Это было бы как:Теперь, если вы находитесь в области действия отдельного элемента и вызова
$root.removeItem
, значениеthis
фактически будет привязывать данные на этом уровне (который будет элементом). Используя в этом случае self, вы можете убедиться, что он удаляется из общей модели представления.Другой вариант использования
bind
, который поддерживается современными браузерами и добавляется KO, если он не поддерживается. В этом случае это будет выглядеть так:По этой теме можно сказать гораздо больше и множество шаблонов, которые вы можете исследовать (например, шаблон модуля и раскрытие шаблона модуля), но в основном использование функции дает вам большую гибкость и контроль над тем, как создается объект, и возможность ссылаться на него. переменные, которые являются частными для экземпляра.
источник
self
иthis
одинаковы, поэтому либо будут эквивалентны. В функции removeItemself
она становится более полезной, посколькуthis
больше не будет текущим экземпляром при выполнении в контексте дочернего элемента.Я использую другой метод, хотя и похожий:
Пара причин:
this
, что может привести к путанице при использовании вko.computed
s и т. Д.new viewModel()
)источник
My viewModel is a singleton, I don't need to create multiple instances (i.e. new viewModel())
но не ясно, что вы пытаетесь сказать,I don't need to create multiple instances
можете ли вы использовать PLZZ больше, чтобы можно было понять преимущества вашего подхода. спасибоfunction
заключается в том, что вы выполняете его более одного раза. Тем не менее, в моем примере о, это немедленно вызванная анонимная функция, поэтому она не будет создана более одного раза. Он очень похож на Object Literal в приведенном выше примере, но дает вам больше изоляции