Никак не могу сообразить, как это сделать. Я начал с решения Джули Лерман «BreezyDevices», чтобы учиться, и я использовал ее модель представления javascript в качестве основы.
У меня есть:
//properties and methods to expose via this class
var vm = {
game: ko.observableArray([]),
save: function () {
dataservice.saveChanges();
},
reset: function () { dataservice.reset(getAllGames) },
};
в верхней части модели представления, и это вернет каждую из моих игр в массиве. Все работает нормально. «Игры» имеют связанные данные, которые возвращают массив под названием «Наборы», содержащий в качестве свойств «наш счет» и «их счет».
На моей html-странице я хочу связать конкретные свойства базы данных, возвращаемые как часть объекта «игра», но я также хочу создать свойство «результат» для каждой игры, которое вычисляется на основе функции javascript, которая перебирает каждый заданный счет и возвращает значения соответственно.
Я попытался использовать макет в решении бриза «Todo» и сразу же настроил его в приведенном выше коде:
initVm();
function initVm() {
addComputeds();
}
function addComputeds() {
vm.result = ko.computed(function () {
var ourSets = getResult().ourSets;
var theirSets = getResult().theirSets;
if (ourSets == 0 && theirSets == 0) {
return "No Result";
}
return (ourSets > theirSets ? "Won " : "Lost ") + "<b>" + ourSets.toString + "</b>-" + theirSets.ToString;
});
}
function getResult() {
var ourSets = 0;
var theirSets = 0;
vm.game().forEach(function (game) {
for (var gs in game.Sets) {
if (gs.ourScore > gs.theirScore) {
ourSets +=1;
}
else {
theirSets +=1;
}
}
});
return {
ourSets: ourSets,
theirSets: theirSets
};
}
но мне кажется, что это добавит «результат» к модели представления (vm), а не к каждому игровому объекту? Кроме того, когда я запускаю код, он не выдает ошибку, но он не создает свойство «результат» везде, где я могу видеть, и просто не работает.
Глядя на это снова, когда я добавляю его сюда, я вижу, что это неправильно, поскольку для обработки каждого результата необходимо иметь дело с каждым конкретным игровым объектом, а не с массивом игр (поэтому мне нужно что-то в vm.games.result, а не vm.result), но я слишком новичок в этом, чтобы понять, как работать с каждым отдельным игровым объектом. Мой кодирующий мозг .net заставит меня передать каждую игровую сущность в цикле функции, чтобы вернуть результат для этой игры, но я не знаю, как это работает с бризом/нокаутом.
Я искал везде, но я просто не могу найти подходящие примеры для моего требования, поэтому был бы очень признателен за некоторые указатели, пожалуйста!
@BeaverProj
У меня есть файл main.js, в котором это происходит:
(function (root) {
var app = root.app;
app.logger.info('Please wait... data loading');
ko.applyBindings(app.gameViewModel, $("content").get(0));
$(".view").css({ display: 'block' });
}(window));
Теперь отредактировали верхний раздел следующим образом:
var vm = {
game: ko.observableArray([]),
save: function () {
dataservice.saveChanges();
},
reset: function () { dataservice.reset(getAllGames) },
result: ko.computed(function () {
var gameRes = getResult();
var ourSets = gameRes.ourSets;
var theirSets = gameRes.theirSets;
if (ourSets == 0 && theirSets == 0) {
return "No Result";
}
return (ourSets > theirSets ? "Won " : "Lost ") + "<b>" + ourSets + "</b>-" + theirSets;
})
};
"getResult" теперь ссылается на "app.gameViewModel.game().forEach(function (Game) {" вместо "vm..."
Как и раньше - ошибок нет, но и результатов тоже. Я все еще получаю массив «игры», но больше ничего. Приведенная выше модель просмотра по-прежнему кажется мне неправильной... "Результат" должен быть привязан к игровому объекту (vm.game), а не к виртуальной машине - в настоящее время это дает vm.result, и есть результат для каждой игры (поэтому vm. game.result), а не для массива игр. Вот почему мне интересно, нужно ли мне расширять сущность с помощью бриза. Я мог бы сделать это в обычном javascript, но кажется, что бриз или нокаут должны сделать это намного проще?