2015-07-17 3 views
1

Я понимаю, что название может вводить в заблуждение, но не знало, как его формулировать любым другим способом.Определение значения, которое не изменяется

Проблема, с которой я сталкиваюсь, заключается в том, что я создаю панель SVG из объекта JSON, и в этом объекте есть движущиеся части, которые контролируются сервером, который отправляет нам значения. Я заставляю движущуюся часть находиться в правильном положении, но через некоторое время она постоянно добавляет X-позицию к себе настолько, что она выходит за границу, что ее не значит делать. В основном то, что он делает, это добавить X + X + X многократно из исходного положения, но я хочу, чтобы он сначала рассматривал исходное положение при вычислении новой позиции.

Вот эта функция, я попробовал иметь оператор if, который проверял переменную standardX и standardY, в то время как они были установлены как неопределенные, он установил obj.transform.baseVal.getItem (length) .matrix.e как значение для него, но это не сработало.

Любые советы по любому обходному решению? Спасибо заранее.

var moveX = function(elem, i) { 
return function() { 
    var stepvalue = 6.25; 
    var step = "0"; 
    var x1 = "0"; 
    var y1 = "0"; 
    var obj = elem.dyn[i].obj; 
    var standardX = obj.transform.baseVal.getItem(length).matrix.e; 
    var standardY = obj.transform.baseVal.getItem(length).matrix.f; 
    console.log(elem.value); 

    if (elem.value <= elem.dyn[i].rlow) { 
     step = 0; 
     x1 = standardY; 
     y1 = standardX; 
     obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 


    } else if (elem.value > elem.dyn[i].rlow && elem.value <= elem.dyn[i].rhigh) { 
     step = stepvalue * elem.value; 
     x1 = step -25; 
     y1 = standardY; 
     x1 += standardX; 
     obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 


    } else { 
     step = stepvalue * elem.dyn[i].rhigh; 
     x1 = step -25; 
     y1 = standardY; 
     x1 += standardX; 
     obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 

    } 

}}; 
+0

Вы делаете x1 = step-25; И затем x1 + = standardX; Это означает, что ваш X1 продолжает расти ... IMO проблема исходит оттуда ... Вы должны привести пример: http://jsfiddle.net это было бы легче понять, что вы хотите, и помочь! – Julo0sS

+0

Я никогда не использовал Fiddle, поэтому не уверен, знаю ли я, как его настроить, но я изменил код на x1 = (step -25) + standardX; Но он по-прежнему слишком сильно перемещается –

+0

Скриншот довольно простой, просто вставьте код html (svg) в верхнюю левую часть (html), стиль css в верхнем правом углу (css) и javascript/jquery внизу слева. Затем нажмите save и ... magic ... – Julo0sS

ответ

1

Не совсем уверен, поскольку у нас нет доступа ко всему коду.
Из того, что я вижу, проблема заключается в том, что вы инициализируете standardX и standardY при каждом вызове функции.

Вы можете инициализировать их при объявлении функции, например, так:

var moveX = function(elem, i) { 
    return function() { 
     var stepvalue = 6.25; 
     var step = "0"; 
     var x1 = "0"; 
     var y1 = "0"; 
     var obj = elem.dyn[i].obj; 

     console.log(elem.value); 

     if (elem.value <= elem.dyn[i].rlow) { 
      step = 0; 
      x1 = moveX.standardY; 
      y1 = moveX.standardX; 
      obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 


     } else if (elem.value > elem.dyn[i].rlow && elem.value <= elem.dyn[i].rhigh) { 
      step = stepvalue * elem.value; 
      x1 = step -25; 
      y1 = moveX.standardY; 
      x1 += moveX.standardX; 
      obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 


     } else { 
      step = stepvalue * elem.dyn[i].rhigh; 
      x1 = step -25; 
      y1 = moveX.standardY; 
      x1 += moveX.standardX; 
      obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 

     } 

    }; 
}; 
moveX.standardX = obj.transform.baseVal.getItem(length).matrix.e; 
moveX.standardY = obj.transform.baseVal.getItem(length).matrix.f; 

Другим вариантом может быть следующим, если он нуждается в каком-то динамической инициализации.

var moveX = function(elem, i) { 
    var standardX = obj.transform.baseVal.getItem(length).matrix.e; 
    var standardY = obj.transform.baseVal.getItem(length).matrix.f; 

    return function() { 
     var stepvalue = 6.25; 
     var step = "0"; 
     var x1 = "0"; 
     var y1 = "0"; 
     var obj = elem.dyn[i].obj; 

     console.log(elem.value); 

     if (elem.value <= elem.dyn[i].rlow) { 
      step = 0; 
      x1 = standardY; 
      y1 = standardX; 
      obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 


     } else if (elem.value > elem.dyn[i].rlow && elem.value <= elem.dyn[i].rhigh) { 
      step = stepvalue * elem.value; 
      x1 = step -25; 
      y1 = standardY; 
      x1 += standardX; 
      obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 


     } else { 
      step = stepvalue * elem.dyn[i].rhigh; 
      x1 = step -25; 
      y1 = standardY; 
      x1 += standardX; 
      obj.setAttribute("transform", "translate("+ x1 + "," + y1 +")"); 

     } 

    }; 
}; 

Следует отметить, что все это возможно, поскольку вы можете обращаться к переменным, объявленным за пределами текущей функции.
Вы можете найти больше о функциональном пространстве и контекстном переключателе в this article.

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