2012-06-22 3 views
4

Я пытаюсь сделать небольшой урон калькулятор для игры Diablo 3 (знаю, я знаю).Дублировать массив в Knockout.js

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

В каждом массиве отображается итоговое значение DPS (более того, это лучше), и оно показывает разницу между ними. Идея заключается в том, что она позволяет легко сравнивать два предмета при использовании игрового аукционного дома.

У меня первый бит установлен - массив «до» работает отлично. Однако я не понимаю, как создать массив «after», и мне интересно, сделал ли я эту сложную сложность. Должен ли я использовать две модели представления, реплицируя их в jQuery или используя плагин сопоставления? Я не могу достаточно найти ничего, что это именно то, что я после этого, требования к UI особенно, кажется, немного мертвую точку

Скрипки, где я до: http://jsfiddle.net/kimadactyl/GuMuY/8/

+2

Очевидно, вам нужны два разных массива. Массив 'after' является копией' before' (т. Е. Глубокой копии). Затем вам нужно определить пользовательскую привязку Knockout для массива 'before', который в update обновит массив' after'. И вы сделали! Постскриптум jbabey, definetly not me - Меня не волнует Diablo 3. :) – freakish

+0

Спасибо - какой правильный способ сделать здесь глубокую копию? Те, которые я пробовал либо обновлять как в синхронизации, так и не работали должным образом. Когда вы говорите пользовательскую привязку, вы имеете в виду написать функцию класса? Я не слишком хорош в терминологии! Редактировать: я нашел страницу документов, спасибо, это именно то, что я искал! – kimadactyl

+2

Когда я говорю «custom binding», я имею в виду это: http://knockoutjs.com/documentation/custom-bindings.html Что касается глубокой копии ... в вашем случае достаточно инициализировать 'new HeroItem (...) 'дважды в' HeroItem' и добавить один в 'before' и второй в' after'. – freakish

ответ

2

Вот решение, которое должно получить ты начал. Я реорганизовал ваш HeroItem, чтобы взять объект конфигурации и необязательный связанный Герой.

Я предполагаю на данный момент массив фиксированной длины. Я создаю массив after из массива элементов, сопоставляя его с новым HeroItem, используя jquery, чтобы сделать глубокую копию.

Когда link передан в HeroItem, он будет подписаться на изменения в своих наблюдаемых и обновить односторонний только указанный.

function HeroItem(config, link) { 
    var self = this, prop; 
    self.item = config.item; 
    self.int = ko.observable(config.int); 
    self.ias = ko.observable(config.ias); 
    self.critdmg = ko.observable(config.critdmg); 
    self.critpc = ko.observable(config.critpc); 
    self.min = ko.observable(config.min); 
    self.max = ko.observable(config.max); 

    if (link) { 
     for (prop in link) { 
      if (link.hasOwnProperty(prop) && ko.isObservable(link[prop])) {  
       console.log("subscribing " + prop); 
       link[prop].subscribe((function(p) { 
        return function (newValue) { 
         console.log("updating " + p+ " to " + newValue); 
         self[p](newValue); 
        } 
       })(prop)); 
      } 
     }   
    } 
} 

self.after = ko.observableArray(ko.utils.arrayMap(self.items(), function(i) { 
    return new HeroItem($.extend({}, ko.toJS(i)), i); 
})); 

http://jsfiddle.net/madcapnmckay/2MNFn/1/

Нет пользовательских привязок нужен, он просто использует возможности подписки все наблюдаемые KO имеют. Если вы хотите расширить это, чтобы справиться с массивами динамической длины, просто подпишитесь на массив элементов и соответствующим образом очистите последующий массив.

Надеюсь, это поможет.

+0

Спасибо за это. Рефакторинг определенно необходим.Однако я все еще боюсь, как получить новые итоговые столбцы. Поскольку они просто ссылки, я не могу найти способ заставить Knockout добавить столбцы «после», не нарушая подписку. Есть идеи? – kimadactyl

+0

Не волнуйся, я переусердствовал. Вы получили это совершенно, даже если я не полностью понимаю ваше расширение объекта HeroItem. Благодаря! – kimadactyl

Смежные вопросы