goo blog サービス終了のお知らせ 

こんにちは、ねこです。

自称プログラマのおばちゃんのブログです。いろいろあるよねぇ~。

AngularとDOJOの違い比べてみた。

2017-02-06 06:15:16 | Dojo ToolKit

みなさん、おはよーございます。

今日は、AngularとDOJOの違い比べてみました。こちら、四枚のねこの写真をスライドショウさせるだけのプログラム

こちらDOJO

http://jsfiddle.net/treasonx/FB3zs/6/

そして、こちらAngularJS

http://jsfiddle.net/treasonx/Ukf39/9/

[CSS両方とも]

.image img {
display: block;
}

[DOJO HTML]

<h1>Show Time</h1>
<div data-dojo-type="kittenShow" data-dojo-props="slideCount: 5, delayTime: 3"></div>

[AngularJS HTML]

<div ng-app="meow">
<h1>Show Time</h1>
<kitten-show kt-slides="5" kt-delay="3"></kitten-show>
</div>

 

--------------------------------------------------------------------------------------------------------------------------------------

[DOJOコード]

require([
'dojo/parser',
'dojo/_base/lang',
'dojo/_base/declare',
'dijit/_WidgetBase',
'dijit/_TemplatedMixin',
'dojo/domReady!'
], function(
parser,
lang,
declare,
_WidgetBase,
_TemplatedMixin) {

declare('kittenShow', [_WidgetBase, _TemplatedMixin], {//ここで_WidgetBase, _TemplatedMixinをつかって’kittenShow’という、ウィジットをあたらしくつくってますね。これで直接HTMLを書いてそこに反映させるようです。
slideCount: 0,
delayTime: 0,
_currentSlide: 0,
_imageSizes: [],
templateString: '<div class="frame"><div class="image"><strong data-dojo-attach-point="titleEle"></strong><img data-dojo-attach-point="imgEle"></div></div>',
startup: function() {
this._imageSizes = generateImageSizes(this.slideCount);
this._updateShow();
setInterval(lang.hitch(this, function() {
this._updateShow();
}), this.delayTime*1000);
},
_updateShow: function() {
var size;
this._currentSlide = ++this._currentSlide >= this._imageSizes.length ? 0 : this._currentSlide;
size = this._imageSizes[this._currentSlide];
this.titleEle.innerHTML = 'kitten '+ this._currentSlide;
this.imgEle.src = 'http://placekitten.com/'+size.width+'/'+size.height;
}
});

parser.parse();//ここでパースさせてウィジットを完成させてます。

//utility functions
function randomSize() {//generateImageSizesにつかうサイズをランダムに計算させるプロパティを作成

return Math.floor(Math.random()*15) * 50;

}

function generateImageSizes(count) {//this._imageSizesでつかうプロパティを作成
var out = [];
var width;
var height;
while(count--) {
width = randomSize();
height = randomSize();
if(width > height) {
height = width / 0.5;
} else {
width = height / 0.5;
}
out.push({
width: width,
height: height
});
}
return out;
}
});

 

--------------------------------------------------------------------------------------------------------------------------------------

[AngularJSコード]

 

(function(angular) {

var module = angular.module('meow', []);//meowのモジュールを定義してディレクティブの受け皿を作る。この中のものはangularですべて料理できる。


//kittenshowのディレクティブを着くる。やっぱr、テンプレートは直でHTML
module.directive('kittenShow', function() {
return {
restrict: 'E',
replace: true,
template: '<div class="frame"><div class="image"><strong>kitten {{name}}</strong><img src="http://placekitten.com/{{width}}/{{height}}"></div></div>',
link: function(scope, ele, attrs){
var slideCount = parseInt(attrs.ktSlides, 10) || 4;
var delay = parseInt(attrs.ktDelay, 10) || 3;
var sizes = generateImageSizes(slideCount);
var currentSlide = 0;

function rotateImage() {
currentSlide = ++currentSlide >= sizes.length ? 0 : currentSlide;
scope.width = sizes[currentSlide].width;
scope.height = sizes[currentSlide].height;
scope.name = currentSlide;
}

rotateImage();

setInterval(function() {
scope.$apply(rotateImage);
}, delay*1000);

}
};
});

// utility functions
function randomSize() {
return Math.floor(Math.random()*15) * 50;
}

function generateImageSizes(count) {
var out = [];
var width;
var height;
while(count--) {
width = randomSize();
height = randomSize();
if(width > height) {
height = width / 0.5;
} else {
width = height / 0.5;
}
out.push({
width: width,
height: height
});
}
return out;
}
}(this.angular));

 

--------------------------------------------------------------------------------------------------------------------------------------

 実際ねこが使ってみて最初に思ったのは、動いてるレベルが完全にちがうので、それぞれつかいわけてみてもいいんじゃないか、ということです。
たとえば、メインの『request』や『ウィジット』なんかはDOJOでかいて、その他の動的ページアクションは影響されずに直である吐き出され済みのHTMLを操作できるangularでやるみたいな。データがあってもなくてもangularならそのまま箇所箇所で動いてくれるんで、DOJOのバグに左右されないという利点があります。
 
たとえば、こんなコード

var app = angular.module('myApp', []);
app.controller('sessionController', function($scope, $http) {

$scope.session1 = false;
$scope.toggle_session1 = function(){$scope.session1 = !$scope.session1;};

$scope.session2 = false;
$scope.toggle_session2 = function() {$scope.session2 = !$scope.session2;};
 });

session1とsession2が個々にshow/hideしてくれます。のこりはこの中にDOJOつかって書き込んだらいいですよね。

もちろん、両方ともjavascriptなんで約束変数の名前衝突なんかはきをつけないとね。おぉ、あとangularは使いすぎると重くなってしまいますので、きをつけましょう!!!

 

あぁ、今日は月曜日。。。気が重い。

でもがんばるでぇ~!!!

 

ねこでした。


CSSのみでDOJO.FXを使ってアニメーション(自動的にキラキラ光り続ける)を作ってみた。

2017-01-06 08:45:50 | Dojo ToolKit

はい、こんにちは。久しぶりにノート書きます。

DOJOをつかってリストにあるもののみ、指定の位置にCSSだけで光り続けるアニメーションを載せます。

1. 準備
- [元となるPNGファイル]
img/maps/元となる絵.png

- [あなたのarray]アニメーションで表示するPLACE(json file)
[{PLACE:"a1", NAME:"TOMATO"},
{PLACE:"b1", NAME:"CUCAMBER"},
{PLACE:"c1", NAME:"LEMON"}]

- [あなたのJSONリスト]アニメーションで表示するための座標リスト。(json file)
[{place:0,left:442,top:211},
{place:a1,left:442,top:211},
{place:2,left:550,top:297},
{place:b3,left:543,top:244},
{place:c4,left:85,top:67}]

こんな具合で実際のサイズでPNGファイルをクリックして取ればいいのではないでしょうか。
そうすれば、サイズさえ同じであれば思ったところに光るアニメーションを置けます。

(test.php)あなたのJSONリストを先につくっておりましょう。
<html><head>
<?php
if (isset($_GET['left']) && isset($_GET['top']) && isset($_GET['place'])){
$myfile = fopen("あなたのJSONリスト.json", "a") or die("Unable to open file!");
$txt = "{place:".$_GET['place'].",left:".$_GET['left'].",top:".$_GET['top']."},\n";
fwrite($myfile, $txt);
fclose($myfile);
}
?>
<script>
function getLocation(){
document.getElementById("left").value = this.event.offsetX;
document.getElementById("top").value = this.event.offsetY;
}
</script>
</head>
<body>
<img src="img/maps/元となる絵.png" width="668" onClick="getLocation();">
<form action="test.php" method="get">
Place: <input type="text" name="place" id="place"><br>
Left: <input type="text" name="left" id="left"><br>
Top: <input type="text" name="top" id="top"><br>
<input type="submit">
</form>
</body></html>
これで、準備OK。


2.実装
(main.php)こちらメインです。
<html>
<head>
<!--<?php //include_once("わたしはここにdojo関係のディレクトリをまとめています.php"); ?>//必要なDOJOのモジュールを読んでください。
ルートはディレクトリーによって違います。いろいろググッてDOJOの設置の仕方を確認してください。 -->
<script>
var あなたのarray = [];
あなたのarray.push({PLACE:"a1", NAME:"TOMATO"});
あなたのarray.push({PLACE:"b1", NAME:"CUCAMBER"});
あなたのarray.push({PLACE:"c1", NAME:"LEMON"});
funcMap(あなたのarray);

function funcMap(あなたのarray){
require([
"dojo/request",
"dojo/dom",
"dojo/_base/fx",
"dojo/fx"
], function(request, dom, fx, coreFx){
var delay = 200;
dojo.xhrGet({
url: "あなたのJSONリスト.json",
handleAs: "json",
load: function(あなたのJSONリスト) {
for (var i=0;i<あなたのarray.length;i++){
var vLeft = あなたのJSONリスト[あなたのJSONリスト.map(function(e) { return e.place; }).indexOf(あなたのarray[i].PLACE)].left;
var vTop = あなたのJSONリスト[あなたのJSONリスト.map(function(e) { return e.place; }).indexOf(あなたのarray[i].PLACE)].top;
var vPlace = あなたのJSONリスト[あなたのJSONリスト.map(function(e) { return e.place; }).indexOf(あなたのarray[i].PLACE)].place;
var nodeCnvs = document.createElement("canvas");
var attStyle = document.createAttribute("style");
attStyle.value = ""
+"background-color:#ccb;"
+"position: absolute;"
+"left:"+vLeft+"px;"
+"top:"+vTop+"px;"
+"";
nodeCnvs.setAttributeNode(attStyle);
var attId = document.createAttribute("id");
attId.value = "mapId"+vPlace;
nodeCnvs.setAttributeNode(attId);
dom.byId("wrapper").appendChild(nodeCnvs);

//ここからループでアニメーションを書き出していきます。
eval("var vOmapId"+vPlace+" = new fx.fadeOut({"
+"node:'mapId"+vPlace+"', "
+"delay: parseInt(delay), "
+"duration:1100,"
+"onEnd: function(){"
+"var vImapId"+vPlace+" = new fx.fadeIn({ "
+"node:'mapId"+vPlace+"', "
+"delay: parseInt(delay), "
+"duration:1100,"
+"onEnd: function(){"
+"vOmapId"+vPlace+".play();"
+"}"
+"}).play();"
+"}"
+"}).play();");
}
},
error: function(err) {
/* this will execute if the response couldn't be converted to a JS object,
or if the request was unsuccessful altogether. */
}
});
}
);
}
</script>

//CANVASではなくてもSVG、ボタンなどのノードでもOKですね。
<style type="text/css">
div#wrapper {
width: 668px;
height: 318px;
margin: 0 auto;
}
canvas{
width: 7px;
height: 7px;
border: 1px solid #F00;
color: #F00;
text-align: center;
}
.relative{
position: relative;
}
</style>
</head>
<body>
<div id="wrapper" class="relative">
<img src="img/maps/元となる絵.png" width="668">
</div>
</body>
</html>
これでおしまい。もし、データなどのリフレッシュが必要な場合はノードをきれいにしてからかウェイジットを書きお直しましょう。


全部変数でdojoのウィジットを作っちゃいます。

2015-07-22 09:53:17 | Dojo ToolKit

***************************************************************
//[PHP]

$jason = json_encode($data);
$jason = str_replace("[", "", $jason);
$jason = str_replace("]", "", $jason);

echo $jason;

// これで $ary = [{"A":"aaa","B":"bbb","C":"ccc","D":"ddd","E":"eee"}] の”[ ]”がとれます。
//なので、$ary = {"A":"aaa","B":"bbb","C":"ccc","D":"ddd","E":"eee"}になって、jsonのレイヤー[0]がひとつ取れてあとでキーが取り出せます。


***************************************************************
//[Javascript & DOJO]

require(["dojo/request",
"dojo/store/Memory",
"dojo/parser",
"dijit/form/RadioButton",
"dojo/domReady!"],
function(request, Memory, Parser, RadioButton, dom){

request.post("jasondata(上のPHP).php", {
handleAs: "json",
data: {
sendfrom : "table",
}
}).then(function(back_data(上のphpからのもどりデータ)){
//back_data = {"A":"aaa","B":"bbb","C":"ccc","D":"ddd","E":"eee"}
var aryElement = []; // ここに新しくキーのみの配列を挿入します。
for(i in back_data){
var key = i;
var val = back_data[i];
aryElement.push(key);
// ここで $aryKey = ["A","B","C","D","E"]となってのちに、それぞれに<FORM>を作成、そのつど後でやってくる「json_data」の数だけラジオボタンを自動生成させていきます。
console.log(key+":"+val);// よーく、確認しましょう!
}

request.post("json_data(ラジオボタンの種類が入ってるリファレンスデータ).php", {
handleAs: "json",
data: {
sendfrom : "table",
}
}).then(function(jsonradio){

// さぁ、ここから、「json_data」で自動的に呼び出した数だけのラジオボタンをそれぞれの行に挿入していきます。
//まずは行作成。キーの数だけ行が欲しいんですよね。$aryElement = ["A","B","C","D","E"]

//一番外のループはキーの数だけ回ります。
for (var i=0;i<aryElement.length;i++){
var vString = String(aryElement[i]);
eval("var vRdoBtn"+vString+";");
eval("var vTxt"+vString+";");

//次にそれぞれのボタンのダミー変数作成。
//二番目のループはラジオボタンの数だけ回ります。でも、ダミーなんで、一応終わらせます。
for (var vI=0;vI<jsonradio.length;vI++){
eval("var rdoBtn"+vString+vI+";");
eval("var txt"+vString+vI+";");
}

//後から呼びだされるファンクションです。ここで一応どんなボタンにもともとの値があるか確認してそれぞれに「checked」の値を受け渡します。もちろん、「back_data」の値ですね。
function fncGetOrg(vI){
if (back_data[vString] === String(vI)){
document.getElementById("Txt"+vString).innerHTML = ""+String(vI)+" = "+jsonradio[vI].Konovalue+"";
return true;
}else{
return false;
}
}

//ここから実際のdijit.form.RadioButtonを作成。
//三番目のループですが、ラジオボタンの数だけ回り、DOJOのウィジットを作っていきます。
for (var vI=0;vI<jsonradio.length;vI++){
vRdoBtn = eval("rdoBtn"+vString+vI+"");
var vRdoBtn = new RadioButton({
id:vRdoBtn,
value: String(vI),
checked: fncGetOrg(vI) ,//ここですよーぉ!ここで上のファンクションにいってvalueとcheckedの確認をさせます。戻り値はそのままつかいましょう。
name: "B_rdo"+vString+"",
onClick: function(evt){
//こうすることでクリックされたときに「Konovalue(jsonradioのリファレンスから)」が確実に選ばれてそれぞれのHTMLのセルに入ることになります。HTMLはこの後に書いときます。
document.getElementById("Txt"+evt.currentTarget.name.substring(5)).innerHTML = ""+jsonradio[evt.currentTarget.value].Konovalue+"";
}
});
vRdoBtn.startup();
var nodeLabel = document.createElement("label");

// CSSだってセットできちゃう。
nodeLabel.id = "cssLabel";
//ここはなぜか苦労した。。。「jsonradio」のvalueをそれぞれのボタンのラベルにします。
var vTxt = dojo.doc.createTextNode(String(vI));
vRdoBtn.placeAt(document.getElementById("FORM"+vString+""));
nodeLabel.appendChild(vTxt);
document.getElementById("FORM"+vString+"").appendChild(nodeLabel);
}

});


***************************************************************
//[HTML]

<table>
<tr>
<td>A</td>
<td><div><form id="FORMA"></form></div></td>
<td><div id="TxtA"></div></td>
</tr>
<tr>
<td>B</td>
<td><div><form id="FORMB"></form></div></td>
<td><div id="TxtB"></div></td>
</tr>
<tr>
<td>C</td>
<td><div><form id="FORMC"></form></div></td>
<td><div id="TxtC"></div></td>
</tr>
<tr>
<td>D</td>
<td><div><form id="FORMD"></form></div></td>
<td><div id="TxtD"></div></td>
</tr>
<tr>
<td>E</td>
<td><div><form id="FORME"></form></div></td>
<td><div id="TxtE"></div></td>
</tr>
</table>

 

ってなわけで、さぁ、仕事に戻ろう。。。

このままコピペしてもうごきませんので、あしからずデータをご準備ください。デバッグも忘れずに。

 

ねこでしたぁ~!


お久しぶりです。今日はアメリカの人事性格分析の言葉について。

2015-06-16 14:57:27 | Dojo ToolKit

さぁ、もし皆さんがアメリカの会社を受ける場合、"Describe Yourself"自分を表現しましょうなどとあるかもしれません。こんな感じ。




でも、なんのこっちゃわからんがな。。。ってなことで、日本語バージョンがこちら。



これでググる手間がはぶけるってもんだっ!



あぁ、XXbe社のライブサイクルやっと抜け出せて、ただ今ウェブアプリケーションに邁進中!!!

ねこでした。


動的に変数名を生成させてdojox.grid.EnhancedGridを書く(JSON使用)

2014-08-19 14:36:26 | Dojo ToolKit
やっと二つ目のDOJO+Javascript+PHP+JSON+DB2 X ZENDのプロジェクトが終盤を迎えてます。
いま、テストランしてます。。。
このまま問題が起こらなければよいのだが。。。

今回は動的に変数名を宣言して、データの数だけデータグリッド(DataGrid)を書かせていきます。
主な項目は、

1.JSONデータを整える
2.仮想変数を宣言する。
3.本番変数を宣言する。
4.ループ開始する。
5.本番メモリーを宣言する。
6.オブジェクトストアを使ってメモリーを格納する。
7.仮想変数に本番変数を挿入する。
8.仮想変数を軸にhtmlを書かせる。
9.仮想変数にメソッドの支持を書く。

では、くわしく。。。

===============================
1.JSONデータを整える

<生データ>
"AAA":"BBB":"CCC"
"a1111":"b1111":"cc1"
"a1111":"b1111":"cc2"
"a2222":"b1111":"cc3"
"a3333":"b3333":"cc4"
"a3333":"b3333":"cc5"
"a3333":"b3333":"cc6"
"a4444":"b4444":"cc7"

<JSON>
[[{"AAA":"a1111","BBB":"b1111","CCC":"cc1"},
{"AAA":"a1111","BBB":"b1111","CCC":"cc2"}],

[{"AAA":"a2222","BBB":"b1111","CCC":"cc3"}],

[{"AAA":"a3333","BBB":"b3333","CCC":"cc4"},
{"AAA":"a3333","BBB":"b3333","CCC":"cc5"},
{"AAA":"a3333","BBB":"b3333","CCC":"cc6"}],

[{"AAA":"a4444","BBB":"b4444","CCC":"cc7"}]]


こんな風にデータをJSONへ生成したいとします。 ほんちゃんでは、いくつグループがくるかわかりませんよね。
そしてねこの場合、この部分はPHPで整えてエンコードさせました。
JSONエンコードの箇所、気をつけてください。それぞれ出来上がったグループからエンコードしちゃうと思ったような形になりません。
先に最後までループでArrayを構築しておき、最後に一気にJSONにしてしまいます。

[json.php]

$db2_con=db2_connect($あんたのサーバ,$あんたのユーザー名,$あんたのパスワード);
$result=db2_exec($db2_con, "Select AAA as AAA, BBB as BBB, CCC as CCC group by AAA, BBB, CCC") or die("Data error");
$data = array();

while($myRow = db2_fetch_assoc($result)){
$data[] = $myRow;
}

$setJ = array();
$setS = array();

$a = 0;

for ($i=0;$i<count($data);$i++){
$setJ[$a][$i]['AAA'] = $data[$i]['AAA'];
$setJ[$a][$i]['BBB'] = $data[$i]['BBB'];
$setJ[$a][$i]['CCC'] = $data[$i]['CCC'];
}

$s = 0;
$cmpAAA = $setJ[0][0]['AAA'];
$cmpBBB = $setJ[0][0]['BBB'];

for ($a=0;$a<count($setJ);$a++){

for ($i=0;$i<count($setJ[$a]);$i++){

if ($setJ[$a][$i]['AAA'] !== $cmpAAA || $setJ[$a][$i]['BBB'] !== $cmpBBB){
$s=$s+1;
$setS[$s][] = $setJ[$a][$i];
$cmpAAA = $setJ[$a][$i]['AAA'];
$cmpBBB = $setJ[$a][$i]['BBB'];
}else{
$setS[$s][] = $setJ[$a][$i];
}

}

}

echo json_encode($setS);

db2_close($db2_con);


===============================
2.仮想変数を宣言する。
[main.php]

ver inGrid = "json.php";
request.get(iniGrid, { handleAs: "json" }).then(function(response){

var vData;
var vGrid;

===============================
3.本番変数を宣言する。
for (var vI=0;vI<response.length;vI++){
eval("var data"+vI+";");
eval("var grid"+vI+";");
eval("var title"+vI+";");
}

===============================
4.ループ開始する。
for (var vI=0;vI<response.length;vI++){
===============================
5.本番メモリーを宣言する。
eval("var data"+vI+" = new Memory({data: response[vI]});");
===============================
6.オブジェクトストアを使ってメモリーを格納する。
var store = new ObjectStore({objectStore: eval("data"+vI)});
var vPtitle = response[vI][0].AAA;///タイトル用の変数宣言。
var layout = [
{name: vPtitle, field: 'BBB', width: "auto"},///こうするとヘッダーにAAAのVALUEが表示される。
{name: 'AAA header', field: 'AAA', hidden: true},
{name: 'BBB header', field: 'BBB', hidden: true},
{name: 'CCC header', field: 'CCC', width: "auto"}
];

===============================
7.仮想変数に本番変数を挿入する。
vTitle = eval("title"+vI+"");
////それぞれのテーブルに"BBB"のVALUEのタイトルをつける。
var vTitle = new dijit.form.TextBox({
id:"title"+vI,
value:response[vI][0].DBNAME,
readonly: true,
onClick: function(){
vBack.focus();
},
style:"width:100%;"
});

vGrid = eval("grid"+vI+"");
var vGrid = new dojox.grid.EnhancedGrid({
id:"grid"+vI,
store:store,
structure: layout,
style: "width: 58em;height:42em;border:0;margin-bottom:2em;padding-bottom:0.5em;cursor:pointer;",
autoHeight: true,
plugins: {
pagination: {
defaultPageSize: 5,
pageSizes: ["5", "10", "All"],
description: true,
sizeSwitch: true,
pageStepper: true,
gotoButton: true,
maxPageStep: 3,
position: "top",
}
}
});

//// このgridAreaはHTML部分で<Div ID="gridArea"></Div>として受け皿にしておく。
//// placeAtにvTitleをダブルでplaceAtすることで、それぞれのループに追持してこのvTitleが表示される。
vGrid.placeAt("gridArea",vTitle.placeAt("gridArea"));

===============================
8.仮想変数を軸にhtmlを書かせる。
vGrid.startup();
vGrid._refresh();
===============================
9.仮想変数にメソッドの支持を書く。
vGrid.on('CellClick', function(evt){
var colField = evt.cell.field;
var rowIndex = evt.rowIndex;
var rowData = this.getItem(evt.rowIndex);
alert("あんたがクリックした列のCCCは "+rowData.CCC+"ですね。");
}, true);
}
/////ループ終わり
})

===============================
*これで完成です。
<画面>

①[タイトル]
②[ヘッダー]
③[データ]

[b1111]
<u>a1111-CCC
b1111-cc1
b1111-cc2

[b1111]
a2222-CCC
b1111-cc3

[b3333]
a3333-CCC
b3333-cc4
b3333-cc5
b3333-cc6

[b4444]
a4444-CCC
b4444-cc7

===============================

PHPの部分はきっとarray=>[]などの方法があるんで、いろいろ考えてみてください。
ぜひとも絵でお見せしたいのだが、もう子猫を迎えに行く時間なので、今日はどろんっ!

ねこでした。

PS.間違ってたらおしえてね。