Autor Zpráva
návštěvník
Profil *
Do knihovny Springy jsem přidal funkci RGBMix:
(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        define(function () {
            return (root.returnExportsGlobal = factory());
        });
    } else if (typeof exports === 'object') {
        module.exports = factory();
    } else {
        root.Springy = factory();
    }
}(this, function() {

    var Springy = {};

  Springy.RGBMix = function (color1, color2, alpha) {
    color1 = Color(color1);
    color2 = Color(color2);
    var r = color1.red() * alpha + color2.red() * (1-alpha);
    var g = color1.green() * alpha + color2.green() * (1-alpha);
    var b = color1.blue() * alpha + color2.blue() * (1-alpha);       
  return Color().rgb([r, g, b]).hexString();  
  }

  return Springy;
}));

V druhé knihovně potřebuju použít tu funkci tak zkouším:
(function() {

jQuery.fn.springy = function(params) {
  var RGBMix = new Springy.RGBMix();
  var fadeColors = { f1:RGBMix('black',fadeColor,0.45), f2:RGBMix('black',fadeColor,0.18), f3:RGBMix('black',fadeColor,0.15) }
  
  var layout = this.layout = new Springy.Layout.ForceDirected(params);
    return this;
}
  
})();
A nejde to. Žádnou chybu mi to nepíše ale aplikace přestala pracovat. Jinak když ten řádek zruším a dám tam místo volání toto funkce RGBMix:
var fadeColors = { f1:"", f2:"" , f3:"" };
tak to jede.
Joker
Profil
návštěvník:
Když budu předpokládat existenci funkce Color a příslušného objektu, není definovaná proměnná fadeColor.
návštěvník
Profil *
Jsem to zkrátil ta deklarace tam někde je. Rozjel jsem to voláním Springy.RGBMix
návštěvník
Profil *
Opět potřebuji poradit jak rozjet funkce v knihovně springy.js (http://getspringy.com/demo.html). Přidal jsem tam tyto funkce:

  /* FUNCTIONS TO CALCULATE DISTANCE BETWEEN
     MOUSE CURSOR AND NODE. UNITS: PIXELS.   
  */
Layout.ForceDirected.prototype.setMouseVector = function(x,y) {     
    this.mousepoint.x = x; this.mousepoint.y = y;
    console.log(this);
    return this;    
};

Layout.ForceDirected.prototype.mpSubtract = function(v2) {
  this.mousepoint.x = this.mousepoint.x - v2.mousepoint.x;
  this.mousepoint.y = this.mousepoint.y - v2.mousepoint.y;
return this;
};

Layout.ForceDirected.prototype.mpMagnitude = function() {    
return Math.sqrt(this.mousepoint.x*this.mousepoint.x + this.mousepoint.y*this.mousepoint.y);;
};

funkce má být volána ze souboru springyui.js

jQuery(canvas).mousemove(function(e) {
    if (dragged == null)
      {    
      if ( (new Date().getTime()) - timer >= wait )
        timer = new Date().getTime();
      else
        return false;
      }
      
    var canvasPosition = jQuery(this).offset();
    nearest = layout.getNode(
      canvasPosition,
      e.pageX - canvasPosition.left, // x
      e.pageY - canvasPosition.top // y
      );
    p = layout.getMousePoint();                

    // @TODO: VYPOČÍTAT magnitude (délku přepony) 
    var coords = layout.setMouseVector(e.pageX, e.pageY);
    console.log(coords);
    var sizes = coords.subtract(nearest);
    var distance = sizes.magnitude(); 
    }
setMouseVector funguje dobře. Ale dostávám hlášku, že coords.subtract neexistuje. Podle mě by layout.setMouseVector měl vracet kontext Layout čili objekt layout. Funkce jsou ale umístěny pod Layout.ForceDirected. Dávat do funkcí return this.ForceDirected se mi nejeví jako správný postup. Jak to dořešit?
návštěvník
Profil *
Tak změna. Chtěl bych pod

jQuery.fn.springy
http://getspringy.com/springyui.js
umístit tyto funkce, ale aby byly prototyp:

    /* FUNCTIONS TO CALCULATE DISTANCE BETWEEN
     MOUSE CURSOR AND NODE. UNITS: PIXELS.   
  */
this.prototype.setMouseVector = function(x,y) {     
    this.track.x = x; this.track.y = y;
return this;    
};

this.prototype.subtract = function(v2) {
    this.track.x = this.track.x - v2.track.x;
    this.track.y = this.track.y - v2.track.y;
return this;
};

this.prototype.magnitude = function() {    
        return Math.sqrt(this.coords.x*this.coords.x + this.coords.y*this.coords.y);;
};

Já už to jaksi zkoušel jako prototyp, ale nešlo to. Zkoušel jsem to dát dodatečně za jQuery.fn.springy a taky dovnitř. Problémem je, že na začátku jQuery.fn.springy je nastavení proměnných, ty by každopádně měly zůstat tam na začátku. Tam se nejdříve má nadefinovat this.track, který se v těch funkcích využívá.

Uvnitř jQuery.fn.springy je definovaná událost
jQuery(canvas).mousemove(function(e) {
// a zevnitř se má spouštět:
var distance = this.setMouseVector(e.pageX, e.pageY).subtract(nearest).magnitude();
}

Takže bych potřeboval poradit kam přesně umístit ty funkce a jak to napsat, aby to fungovalo. Tzn. aby this obsahovalo this.track .

Ještě jednou k té struktuře:

jQuery.fn.springy = function(params) {
// nastavení proměnných
this.track = {x:null, y:null};
// ...
var layout = this.layout = new Springy.Layout.ForceDirected(params, canvas);
// ..
Springy.requestAnimationFrame(function adjust() {
// ...
}

//  další nastavení
//  události
jQuery(canvas).mousedown(function(e) {
// ...
}

jQuery(canvas).mousemove(function(e) {
// volání setMouseVector() odsud
}

jQuery(window).bind('mouseup',function(e){
//...
další funkce.
}

}

Čili jak udělat ten design aby to mělo hlavu a patu?
Kubo2
Profil
návštěvník:
this nebude obsahovať this.track, ale výsledok volania konštruktora jQuery(canvas) tj. objekt jQuery. A navyše je v tom celom strašný zmätok. this.track je objekt { number x, number y }, ako nad ním chceš volať .setMouseVector()? A čo je v tom prvom kóde na prvom riadku this resp. this.prototype?
návštěvník
Profil *
Aha tak jsem to špatně napsal. Nejdříve musím znát souřadnice uzlu. Uzel získám pomocí nearest = getNode(...); Ale nearest je typu Node a ten je definován v jiném souboru v jiné knihovně (viz předchozí příspěvek). Nejdříve jsem zkoušel to volat z
Layout.ForceDirected.prototype.setMouseVector();
ale jelo to moc pomalu a nefungovalo zcela správně. Tak jsem to začal dělat znova a zkouším to přesunout do druhého souboru. Jenže to bych teda musel vytvořit objekt s vektorem pod jQuery.fn.springy ... a na něj namontovat ten prototyp. Pak by to mělo vypadat takto:

jQuery(canvas).mousemove(function(e) {
// ...
var distance = nearest.setMouseVector(e.pageX, e.pageY).subtract(nearest).magnitude();
}



Když to tam namontuju (do jQuery.fn.springy) tak mám hlášku TypeError: this.prototype is undefined

  this.prototype.subtract = function(v2) {
    this.track.x = this.track.x - v2.track.x;
    this.track.y = this.track.y - v2.track.y;
return this;
    };

this.prototype.magnitude = function() {    
return Math.sqrt(this.coords.x*this.coords.x + this.coords.y*this.coords.y);;
    };    
return this;
návštěvník
Profil *
Nebo jsem to zkoušel tímto stylem:
  this.track.prototype.setMouseVector = function(x,y) {     
    this.track.x = x; this.track.y = y;
    console.log(this);
    return this;    
    };

A taky chyba TypeError: this.track.prototype is undefined


Tak proč do toho this.track nejde ten prototyp namontovat? To musím udělat z this.track funkci? Prosím poraď jak to mám udělat.
_es
Profil
návštěvník:
Prototyp sa nastavuje funkcii - konštruktoru, volanému s operátorm new. Ak ti to hlási, že niečo.prototype je undefined, tak niečo nie je funkcia. Prečo skúšaš prototyp meniť cez this? Nastav ho priamo tým funkciám.
návštěvník
Profil *
_es:
díky, už se mi to povedlo zrealizovat.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: