2015-04-03 84 views
0

我創建了一個自定義指令,棋盤,顯示國際象棋的位置。使用Ionic框架,我生成一個棋盤列表,並想在左側縮略圖棋盤。雖然我遵循文檔,但使用svg代替,因爲我的指令生成svg,我無法獲得所需的佈局。離子/角度自定義指令和離子列表縮略圖

這裏是my JsBin(不要擔心失蹤的圖片)。

下面是index.html的:

<!DOCTYPE html> 
<html> 
<head>  
<script src="//code.ionicframework.com/1.0.0-beta.13/js/ionic.bundle.min.js"></script> 
<link href="//code.ionicframework.com/1.0.0-beta.13/css/ionic.min.css" rel="stylesheet" type="text/css" /> 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.2/angular.min.js"> </script> 
    <meta charset="utf-8"> 
    <title>JS Bin</title> 
</head> 
<body ng-app="static-board"> 

    <ion-pane> 
     <ion-header-bar class="bar-dark"> 
     <h1 class="title">Chess Positions Archiver</h1> 
     </ion-header-bar> 
     <ion-content> 
     <div class="list"> 
      <a class="item item-thumbnail-left" href="#"> 
      <chess-board cells-size="30" fen="3rr1k1/pb5p/1qp3pB/1pn1Q3/8/7P/PPP3P1/R3KR2 b - - 0 1" show-coords> </chess-board> 
      <h3>Exercise 1</h3> 
      </a> 

      <a class="item item-thumbnail-left" href="#"> 
      <chess-board cells-size="30" show-coords></chess-board> 
      <h3>Exercise 2</h3> 
      </a> 
     </div> 

     </ion-content> 
    </ion-pane> 
    </body> 
</html> 

這裏是我的腳本

(function(){ 
    var chessPieces = { 
    'P': 'wp', 
    'N': 'wn', 
    'B': 'wb', 
    'R': 'wr', 
    'Q': 'wq', 
    'K': 'wk', 

    'b': 'bb', 
    'p': 'bp', 
    'n': 'bn', 
    'r': 'br', 
    'q': 'bq', 
    'k': 'bk' 
    }; 

    angular.module('static-board', ['ionic']) 
    .factory('chessPictures', [function(){ 
    return { 
     getPicture: function(pieceFen){ 
     return chessPieces[pieceFen]; 
     } 
    } 
    }]) 
    .directive('chessBoard', [function(){ 

    function getBoardHtml(cellsSize, positionFen, showCoords){ 

     // taken from http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format 
     function sprintf() { 
     var args = arguments, 
     string = args[0], 
     i = 1; 
     return string.replace(/%((%)|s|d)/g, function (m) { 
      // m is the matched format, e.g. %s, %d 
      var val = null; 
      if (m[2]) { 
      val = m[2]; 
      } else { 
      val = args[i]; 
      // A switch statement so that the formatter can be extended. Default is %s 
      switch (m) { 
       case '%d': 
       val = parseFloat(val); 
       if (isNaN(val)) { 
        val = 0; 
       } 
       break; 
       } 
       i++; 
      } 
      return val; 
      }); 
     } 

     function fenToPosition(){ 
     function getSingleLine(lineFen){ 
      var result = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']; 
      var column = 0; 
      for (var index in lineFen){ 
      var currElem = lineFen[index]; 
      var isDigit = !isNaN(parseInt(currElem)); 
      if (isDigit){ 
       column += parseInt(currElem); 
      } 
      else { 
       result[column] = currElem; 
       column++; 
      } 
      } 
      return result; 
     } 

     var result = []; 
     var parts = positionFen.split(" ")[0].split("/"); 
     for (var partIndex in parts){ 
      var currPart = parts[partIndex]; 
      result.push(getSingleLine(currPart)); 
     } 
     return result; 
     } 

     function getBackground(size){ 
     return sprintf("<rect x='0' y='0' width='%d' height='%d' fill='#BAA' />", size, size); 
     }; 

     function getCells(){ 
     function getSingleCell(cellX, cellY){ 
      var x = cellX*cellsSize + cellsSize/2; 
      var y = cellY*cellsSize + cellsSize/2; 
      var color = (cellX+cellY)%2 === 0 ? "#E9E637" : "#7C4116"; 
      return sprintf("<rect x='%d' y='%d' width='%d', height='%d' fill='%s' />", 
      x,y, cellsSize, cellsSize, color); 
     } 

     var result = ""; 
     for (var line = 0; line < 8; line++){ 
      for (var col = 0; col < 8; col++){ 
      result += getSingleCell(col, line)+'\n'; 
      } 
     } 

     return result; 
     } 

     function getPieces(positionPieces){ 
     function getSinglePiece(cellX, cellY){ 
      var x = cellX*cellsSize + cellsSize/2; 
      var y = cellY*cellsSize + cellsSize/2; 
      var pieceFen = positionPieces[cellY][cellX]; 
      var piecePictureRef = chessPieces[pieceFen]; 
      var path = sprintf("../img/chess_pieces/%s.svg", piecePictureRef); 
      return piecePictureRef ? sprintf("<image x='%d' y='%d' width='%d' height='%d' xlink:href='%s' />", 
      x, y, cellsSize, cellsSize, path 
     ) : undefined; 
     } 

     var result = ""; 
     for (var rank = 0; rank < 8; rank++){ 
      for (var file = 0; file < 8; file++){ 
      var line = getSinglePiece(file, rank); 
      if (line) { 
       result += line+'\n'; 
      } 
      } 
     } 

     return result; 
     } 

     function getPlayerTurn(){ 
     var turnStr = positionFen.split(" ")[1]; 
     var color = turnStr === "w" ? "#FFF" : "#000"; 
     var location = parseInt(8.5*cellsSize); 
     var size = cellsSize/2; 
     return sprintf("<rect x='%d' y='%d' width='%d' height='%d' fill='%s'/>", 
      location, location, size, size, color); 
     } 

     function getCoordinates(){ 
     result = ""; 

     var files = "ABCDEFGH"; 
     for (var index in files){ 
      var currFile = files[index]; 
      result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>", 
      parseInt(cellsSize*index + cellsSize*.8), parseInt(cellsSize*.45), 
      parseInt(cellsSize*.4), currFile); 
      result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>", 
      parseInt(cellsSize*index + cellsSize*.8), parseInt(cellsSize*8.9), 
      parseInt(cellsSize*.4), currFile); 
     } 

     var ranks = "87654321"; 
     for (var index in ranks){ 
      var currRank = ranks[index]; 
      result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>", 
      parseInt(cellsSize*.1),  parseInt(cellsSize*1.25+cellsSize*index), 
      parseInt(cellsSize*.4), currRank); 
      result += sprintf("<text x='%d' y='%d' fill='#000' font-size='%d'>%s</text>", 
      parseInt(cellsSize*8.7),  parseInt(cellsSize*1.25+cellsSize*index), 
      parseInt(cellsSize*.4), currRank); 
     } 

     return result; 
     } 

     var size = 9*cellsSize; 
     var result = sprintf("<svg width='%d'  height='%d'>\n%s\n%s\n%s\n%s\n%s\n</svg>", 
     size, size, getBackground(size), getCells(),  getPieces(fenToPosition()), 
     getPlayerTurn(), showCoords ? getCoordinates() : ""); 
     return result; 
    } 

    return { 
     restrict: 'E', 
     link: { 
     post : function(scope, element, attrs){ 
      var cellsSize = attrs.cellsSize || 20; 
      var positionFen = attrs.fen || 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w'; 
      var showCoords = attrs.showCoords !== undefined ? true : false; 

      var newElem = angular.element(getBoardHtml(cellsSize, positionFen, showCoords)); 
      element.replaceWith(newElem); 
     } 
     } 
    } 
    }]) 
})(); 

那麼,什麼是錯的?

  • 是這樣的事實,我使用代替<IMG>的<SVG>?
  • 還是別的嗎?
+0

看着SVG的上漿一個很好的資源/我的離子項目文件,我注意到從saas定義生成的CSS d此功能僅適用於img標籤,所以我設法爲svg標籤定義相同的功能。由於這在jsbin中是不可能的,我不認爲這是一個答案。此外,我還需要在運行時懶洋洋地編譯saas,但這似乎是不可能的。 – loloof64 2015-04-03 12:25:47

回答

1

你需要做幾件事情:

包裝SVG成一個div,並給它類item-image

<div class="item-image"> 
    <chess-board cells-size="30"></chess-board> 
</div> 

那麼,當您創建SVG,你將需要設置屬性像這樣:

width="100%" height="100%" viewBox="0,0,270,270" 

寬度hight會告訴它如何表現它的容器,而viewBox屬性設置將在其上繪製圖像的畫布大小。

此行

var result = sprintf("<svg width='%d' height='%d'>\n%s\n%s\n%s\n%s\n%s\n</svg>", size, size, getBackground(size), getCells(), getPieces(fenToPosition()), getPlayerTurn(), showCoords ? getCoordinates() : ""); 

應該是這樣的

var result = sprintf("<svg width='100%%' height='100%%' viewBox='0,0,%d,%d'>\n%s\n%s\n%s\n%s\n%s\n</svg>", size, size, getBackground(size), getCells(), getPieces(fenToPosition()), getPlayerTurn(), showCoords ? getCoordinates() : ""); 

你可以在這裏看到它http://jsbin.com/basimodufa/1/edit?html,js,output

有含here