Я пытаюсь собрать демо, чтобы использовать knockout-es5 plugin для упрощения моделей, использующих раскрывающий шаблон модуля. ViewModel1 - оригинальная модель нокаута, и она отлично работает. ViewModel2 - это попытка использовать плагин knockout-es5. Работа в нескольких вещахВыявление шаблона модуля с помощью Knockout-es5
- Вычисляемые свойства не работают, поскольку локальные переменные не отслеживаются (например, fullName1). Я могу использовать ko.defineProperty, но сначала он отделен от других свойств, второй должен использовать this.propertyName.
- Изменения, внесенные функциями-членами, не отражаются, вероятно, по той же причине (например, doSomething). Снова использование this.propertyName работает, но шаблон RM нарушается.
var NS = NS || {};
$(function() {
NS.ViewModel1 = function (first, last) {
var
firstName = ko.observable(first),
lastName = ko.observable(last),
fullName = ko.computed(function() {
return firstName() + " " + lastName();
}),
doSomething = function (n) {
lastName(lastName() + " " + n);
}
;
return {
firstName: firstName,
lastName: lastName,
fullName: fullName,
doSomething: doSomething
};
};
NS.ViewModel2 = function (first, last) {
var
firstName = first,
lastName = last,
fullName1 = ko.computed(function() {
// Changed values are not reflected
return firstName + " " + lastName;
}),
fullName2 = ko.computed(function() {
// Should not work
return this.firstName + " " + this.lastName;
}),
doSomething = function (n) {
// Doesn't work
lastName += " " + n;
// Works
// this.lastName += " " + n;
}
;
var retObj = {
firstName: firstName,
lastName: lastName,
fullName1: fullName1,
fullName2: fullName2,
doSomething: doSomething
};
ko.track(retObj);
ko.defineProperty(retObj, 'fullName3', function() {
// Changed values are not reflected
return firstName + " " + lastName;
});
ko.defineProperty(retObj, 'fullName4', function() {
// Works
return this.firstName + " " + this.lastName;
});
return retObj;
};
var vm1 = new NS.ViewModel1("John", "Doe");
ko.applyBindings(vm1, document.getElementById("observableSection"));
var vm2 = new NS.ViewModel2("Jane", "Doe");
ko.applyBindings(vm2, document.getElementById("withoutObservableSection"));
setTimeout(function() {
vm1.firstName("John 1");
vm2.firstName = "Jane 1";
}, 2000);
setTimeout(function() {
vm1.doSomething(2);
vm2.doSomething(2);
}, 4000);
});
Спасибо за ответ. Проект уже использует этот шаблон, поэтому я надеялся использовать новый плагин для упрощения продвижения моделей. Чем больше я занимаюсь этим, тем больше я понимаю, что плагин предназначен для использования с тем, как модели определены в вышеупомянутом блоге и многих других примерах. Это нормально, я просто хотел убедиться, что я не пропустил ничего очевидного. Иногда ответ «Это невозможно сделать так» - правильный ответ. Я оставлю его открытым на пару дней и приму это. –