2015-01-09 3 views
1

최근에 녹아웃으로 게임을 시작했으며 문제가 발생했습니다. 나는 모든 종류의 방법으로이를 인터넷 검색을 시도했지만 적용 가능한 결과를 찾지 못했습니다. 내가 관찰 계산 Parameters와 결합하고있는 HTML에서개체를 다시 설정하지 않고 계산 된 관찰 가능 다시 계산

var model = new function() { 
    var that = this; 

    this.parameterRegex = ko.observable(/\@@{1}\w+/ig); 
    this.query = ko.observable('SELECT @@par1 from @@par2'); 
    this.parameterNames = ko.computed(function() { 
     var allParameters = that.query().match(that.parameterRegex()); 
     return (allParameters == undefined) ? [] : jQuery.unique(allParameters); 
    }); 
    this.parameters = ko.computed(function() { 
     return ko.utils.arrayMap(that.parameterNames(), function (item) { 
      return { 
       Name: ko.observable(item), 
       Example: ko.observable() 
      } 

     }); 
    }); 
}; 

하지만, 모든 시간이 Query 관찰 변화와 Parameters 관찰 다시 계산, 나는 모든 상태를 잃게 :

의 나는이 모델을 가정 해 봅시다 계산 된 항목.

내가이 의미하는 것은 그 나는 Parameters와 HTML에서 foreach는 바인딩과 나는 같은 것을 foreach는 몇 가지 입력 상자가있는 경우 : 사용자가 입력에 입력 한 것을

<textarea name="query" class="form-control" data-bind="value: query, valueUpdate:'afterkeydown'" rows="10" style="margin-bottom:20px"></textarea> 
<div data-bind="foreach: parameters"> 
    <p data-bind="text: Name"></p> 
    <input type="text"></input> 
</div> 

모든 텍스트 Computed Observeable이 다시 계산되면 손실됩니다.

어떻게 해결할 수 있습니까?

+0

가능 그것입니다. 매개 변수 배열이 전혀 변경되지 않습니까? 그것의 변화가 있다면? 텍스트가 변경되는면은 계산 된 함수의 전체 점입니다. 변경하지 않으려면 계산하지 마십시오. –

+0

매개 변수 배열은 문자열'query'에 따라 변경됩니다. 이것은'@@ par1'과'@@ par2'를 포함하는 문자열 배열로 나뉩니다. 문자열'query'에서 텍스트를 변경하자마자, 계산 된 값이 다시 계산됩니다 –

+0

그래서 무엇이 변경 될까요? –

답변

1

해결 방법은 개체가 포함 된 별도의 배열을 유지 한 다음 매번 개체를 다시 만드는 대신 배열에있는 개체를 다시 사용하는 것입니다. 당신이 당신의 코드를 설명하기 위해

var parameters = []; 
this.parameters = ko.computed(function() { 
    var newParams = []; 
    for (var i = 0; i < that.parameterNames().length; i++) { 
     var name = that.parameterNames()[i]; 
     var result = $.grep(parameters, function(p){ return p.Name() == name; }); 
     var param; 
     if (result.length === 0) { 
      param = { 
       Name: ko.observable(name), 
       Example: ko.observable() 
      }; 
     } 
     else { 
      param = result[0]; 
     } 

     newParams.push(param); 
    } 
    parameters = newParams; 
    return newParams; 
}); 

jsfiddle

+0

이 문제가 해결 되었습니까? 그렇다면 해결책으로 내 대답을 선택하십시오. –

관련 문제