2012-01-24 10 views
0

カスタムプロパティと関数を使用してカスタムRaphael要素を作成したいと考えています。このオブジェクトには、あらかじめ定義されたRaphaelオブジェクトも含まれている必要があります。たとえば、ノードクラスがあります。ノードクラスには、テキストとその他の要素が含まれる円が含まれています。問題は、この新しいオブジェクトをセットに追加することです。 Raphael以外のオブジェクトはセットに追加できないため、これらの要求が必要です。その結果、Raphaelオブジェクトを含むカスタムオブジェクトは使用できません。コードは次のようになります。Raphael.js:新しいカスタム要素を追加する

var Node = function (paper) { 
    // Coordinates & Dimensions 
    this.x = 0, 
    this.y = 0, 
    this.radius = 0, 
    this.draw = function() { 
     this.entireSet = paper.set(); 
     var circle = paper.circle(this.x, this.y, this.radius); 
     this.circleObj = circle; 
     this.entireSet.push(circle); 
     var text = paper.text(this.x, this.y, this.text); 
     this.entireSet.push(text); 
    } 
    // other functions 
} 

var NodeList = function(paper){ 
    this.nodes = paper.set(), 
    this.populateList = function(){ 
     // in order to add a node to the set 
     // the object must be of type Raphael object 
     // otherwise the set will have no elements 
     this.nodes.push(// new node) 
    } 
    this.nextNode = function(){ 
     // ... 
    } 
    this.previousNode = function(){ 
     // ... 
    } 
} 
+0

あなたはこのような何かを探していますか? http://raphaeljs.com/reference.html#Raphael.fn。 .arrow()などの関数の結果として複雑なオブジェクトを作成するカスタム関数を追加する方法について説明します。 – cabreracanal

+0

私が知る限り、Raphael.fnはRaphaelオブジェクトを作成しません。したがって、作成されたオブジェクトをRaphaelセットに追加することはできません。私のクラスは次のようになります。 VARノード=機能(){// 座標および寸法 this.x = 0、 this.y = 0、 this.radius = 0、 this.stroke = 1、 // ... これを返す。 } – Claudia

+0

作成した.fnに添付する機能です。あなたがあなたの質問を理解していれば、テキストを内部に持つ円を作成したいと思うなら、私はこのようにします。この例では、https://gist.github.com/1043360のようにします。あなたのオブジェクトがパスの場合は、それをセットに追加できます。さらに、テキストとサークルを別々に作成してセットに入れることもできます。また、カスタム属性を設定することもできます。 – cabreracanal

答えて

1

このコードを(DOMをロードした後の方法を置く)あなたはテキストでノードを作成することができます(それはセットを返します)、あなたはラファエル・オブジェクトとしてそれを操作することができます:

function loadShape(){ 
    Raphael.fn.node = function(x, y, radius, txt){ 
     this.x = x; 
     this.y = y; 
     this.radius = radius; 
     this.txt = txt; 

     this.drawCircle = function() { 
      return paper.circle(this.x, this.y, radius); 
     }; 
     this.drawText = function() { 
      return paper.text(this.x, this.y, this.txt); 
     }; 

     this.draw = function(){ 
      var group = paper.set(); 
      var circulo = paper.circle(this.x, this.y, radius); 
      var texto = paper.text(this.x, this.y, this.txt); 
      group.push(circulo); 
      group.push(texto); 
      return group; 
     } 
     this.init = function(ox, oy, r, t){ 
      this.x = ox; 
      this.y = oy; 
      this.radius = r; 
      this.txt = t; 
     }; 
     // etc… 
     return this; 
    }; 
    var paper = new Raphael(document.getElementById("wrapper"), "100%", "100%"); 

    //var nodo = paper.node(); 
    //nodo.init(50, 50, 2.0, "soy un nodo"); 
    var nodo = paper.node(250, 150, 50.0, "hola"); 
    nodo.draw(); 
    //circ.attr({"propiedad":"hola"}); 
    //alert(circ.attr("propiedad")); 
} 

これがあなたに役立ったかどうか教えてください。

+0

initメソッドはset()と似ていますが、ノードの設定を変更する場合は、前のセットを削除して再描画する必要があります。これを行うことができる内部関数を定義することもできます;) – cabreracanal

+0

応答をありがとう。私はより多くの説明で私の質問を編集しました。私はあなたが提案したものと似た実装をしています。残念ながら、ノードをRaphaelセットに追加する必要があるため、使用できません。ノードオブジェクトで宣言されたプロパティが必要なので、drawメソッドによって返されたセットだけを追加することはできません。 – Claudia

+0

なぜ単純な配列を使ってノードを保存し、あなたの質問に書いたように、Raphael.fn.nodeをvar Node =と置き換えるのですか? – cabreracanal

2

あなたが唯一paper.setするラファエルオブジェクト(RECT、サークル、日食、テキスト)を追加することができます()、(Raphael.fn付き)ない自己定義されたオブジェクト。代わりにjavascript []の通常の配列定義を使用してください。 私はnodeListが単純なリストだと理解していますが、nextnode、以前のノードなどのより多くのオプションがあります。

はこのデモを見てみましょう、私はabitのホセ・マヌエル・カブレラのコードを変更:http://jsfiddle.net/Tomen/JNPYN/1/

Raphael.fn.node = function(x, y, radius, txt) { 
    this.x = x; 
    this.y = y; 
    this.radius = radius; 
    this.txt = txt; 
    this.circleObj = paper.circle(this.x, this.y, radius), this.textObj = paper.text(this.x, this.y, this.txt); 
    this.entireSet = paper.set(this.circleObj, this.textObj); 
    return this 
} 
Raphael.fn.nodeList = function() { 
    this.nodes = []; 
    this.push = function(p) { 
     return this.nodes.push(p); 
    }; 

    // this.nextNode = function(){ 
    // ... manipulate this.nodes here 
    // } 
    // this.previousNode = function(){ 
    // ... 
    // } 
    return this 
} 
var ca = paper.node(250, 150, 50.0, "hola"); 
var list = paper.nodeList(); 
list.push(ca); 
+0

あなたは大歓迎です。私はあなたと同じ考えをしていました。どうしてノードを通常の配列に格納しないのですか。しかし、私は簡単な方法は、var Node = function ...を使うことだと思います。そして、それは私が思うすべてです:) – cabreracanal

+0

varノードを忘れてしまいました... ... hehe .fnに追加しても問題ありません。 – cabreracanal

+4

あなたのコードJose、私はラファエルには初めてです。私はちょうど私の他の質問の答えを待つ間に来るが、誰もこれまでに答えた人はいない。 – tomen

2

グローバルな「紙」は存在しない場合にいくつかの例は落ちるかもしれ Raphael.fn.yrMethodのコンテキストをしますこの例では、現在サポートされていない何らかの理由であるAGの要素を、ラップラファエルオブジェクトを作成し、インスタンス(紙) こと:

(function(R){ 

     function g(_paper){ 

      var _canvas = _paper.canvas, 
       _node = document.createElementNS("http://www.w3.org/2000/svg", "g"); 

      _canvas.appendChild(_node); 

      this.add = function(rElement){ 
       _node.appendChild(rElement.node); 
      } 

      this.remove = function(rElement){ 
       _canvas.appendChild(rElement.node); 
      } 

      this.transform = function(tString){ 
       _node.setAttribute('transform', tString); 
      } 

     } 

     R.fn.g = function(){ 
      return new g(this); 
     } 

    })(Raphael); 
関連する問題