2013-04-03 2 views
4

С Нокаут Есть несколько возможных моделей создания вид модели, один является использование буквальным:KendoUI - вы можете создать вид модели как функции

var viewModel = { 
    firstname: ko.observable("Bob") 
}; 

ko.applyBindings(viewModel); 

, а другой использовать функцию:

var viewModel = function() { 
    this.firstname= ko.observable("Bob"); 
}; 

ko.applyBindings(new viewModel()); 

Как подробно описано в этом вопросе:

Difference between knockout View Models declared as object literals vs functions

Мои предпочтения всегда заключались в использовании функции, потому что она по сути дает вам «фабрику», позволяющую создавать несколько экземпляров одной и той же модели представления.

С KendoUI, все примеры, которые я видел использовать синтаксис литерала:

var viewModel = kendo.observable({ 
    firstname: "Bob" 
}); 

kendo.bind(document.body, viewModel); 

Мой вопрос, с Кендо является возможность подражать стилю Нокаут создания вида модели с помощью функций? Это позволило бы мне создать несколько экземпляров одной и той же модели представления, добавить «частные» функции и т. Д.

ответ

8

После некоторого раздумья я понял: «Конечно, это возможно!» ...

ViewModel = function() { 
    this.firstname = "Bob"; 

    return kendo.observable(this); 
}; 

var viewModel = new ViewModel(); 

kendo.bind(document.body, viewModel); 

Хотя вы должны быть осторожны, о ссылках на «это» в функции конструктора, поскольку в зависимости от того, когда они выполняются, они могут обратиться к ненаблюдаемому объекту:

ViewModel = function() { 
    firstname = "Bob"; 

    this.doSomething = function() { 
     // here 'this' does not point to an obervable, but 'that' does! 
     that.set("forename", "Craig"); 
    } 

    var that = kendo.observable(this); 
    return that; 
}; 

var viewModel = new ViewModel(); 

kendo.bind(document.body, viewModel); 
Смежные вопросы