2012-06-22 4 views
4

게임 디아블로 3에 약간의 데미지 계산기를 만들려고합니다.Knockout.js의 배열 복제

기본적으로 생각하면 캐릭터의 항목을 나타내는 값의 "이전"및 "이후"배열이 있습니다. "after"배열은 업데이트 될 때 "before"배열을 복제해야합니다. 그러나 "after"배열을 변경하면 이 아닌이 "before"배열을 업데이트해야합니다.

각 배열은 DPS (more more than this better) 합계를 표시하며 두 배열의 차이점을 보여줍니다. 아이디어는 게임 내 경매장을 이용할 때 두 항목을 쉽게 비교할 수있게 해줍니다.

첫 번째 비트가 설정되었습니다. "이전"배열이 훌륭하게 작동합니다. 그러나 나는 "후"배열을 만드는 방법에 관해서는 손해를보고 있으며, 나는 이것을 다른 정도의 복잡성으로 만들었는지 궁금하다. 두 개의 뷰 모델을 사용하거나 jQuery로 복제하거나 맵핑 플러그인을 사용해야합니까? 여기 http://jsfiddle.net/kimadactyl/GuMuY/8/

+2

분명히 두 개의 별개의 배열이 필요합니다. 'after' 배열은'before '(즉, 딥 복사)의 복사본입니다. 그런 다음 업데이트시에'after' 배열을 업데이트하는'before' 배열에 대한 사용자 정의 녹아웃 바인딩을 정의해야합니다. 그리고 너 끝났어! 추신 jbabey, definetly not - 나는 디아블로 3을 신경 쓰지 않는다. :) – freakish

+0

감사합니다. - 여기에 딥 카피를하는 올바른 방법은 무엇입니까? 내가 시도한 것들은 동기화되어 업데이트되었거나 제대로 작동하지 않았다. 사용자 지정 바인딩을 말할 때 클래스 함수를 작성한다는 의미입니까? 나는 용어가 너무 좋지 않다! 편집 : 문서 페이지를 찾았습니다. 감사합니다. 정확히 내가 찾고있는 페이지입니다. – kimadactyl

+2

내가 "사용자 지정 바인딩"이라고 말하면 다음과 같은 의미입니다. http://knockoutjs.com/documentation/custom-bindings.html 깊은 복사본은 ... 새 HeroItem (...을 초기화하는 것으로 충분합니다.)'를'HeroItem'에 두 번 쓰고'before '와'after'리스트에 하나를 더합니다. – freakish

답변

2

받아야하는 솔루션이다 : 나는 확실히 난 후 정확히 무엇을 그 아무것도 찾을 수 있으며, UI 요구 사항은 특히 난제 나는까지 해요 어디

바이올린의 조금 보인다 네가 시작 했어. 나는 당신의 HeroItem을 리팩토링하여 설정 오브젝트와 링크 된 영웅 (옵션)을 가져갔습니다.

현재 배열은 고정 길이라고 가정합니다. jQuery extends를 사용하여 딥 복사를 수행하여 항목 배열에서 HeroItem에 매핑하여 after 배열을 만듭니다.

HeroItem에서 link이 전달되면 관찰 결과에 대한 변경 사항을 구독하고 지정된대로 단방향으로 업데이트합니다.

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의 관찰 가능한 가지고있는 구독 기능을 사용합니다. 이것을 동적 길이에 맞도록 확장하려면 배열을 간단하게 구독하고 그에 따라 after 배열을 정리하십시오.

희망이 도움이됩니다.

+0

감사합니다. 리팩토링이 꼭 필요합니다.그러나 나는 여전히 새로운 컬럼 총계를 얻는 방법으로 고심하고있다. 참조 용 일 뿐이므로 Knockout이 구독을 위반하지 않고 "이후"열을 추가하는 방법을 찾을 수 없습니다. 어떤 아이디어? – kimadactyl

+0

걱정 마세요, 나는 이것을 과소 평가했습니다. 당신도 HeroItem 객체에 대한 당신의 확장을 완전히 이해하지 못합니다. 감사! – kimadactyl

관련 문제