rempei
@rempei

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Play 自動で文字列になってしまう

Q&A

Closed

解決したいこと

function damageCalc() {
      const attack = eval(`${_monstar.status.power[0]}*${_monstar.skill[0].might*0.025}`)
      const damage = eval(attack - `${_pokomon.status.defense[0]}`)
      currentEnemyHP -= damage
      if(currentEnemyHP <= 0) {
        enemyHPGauge.style.width = "0"
      } else {
        updateGauge(currentEnemyHP, maxEnemyHP, enemyHPGauge)
      }
    }

上記はPlayのプロジェクトの関数でアクションから渡された変数を

`${_monstar.status.power[0]}`

のようにして参照しています。
上記のdamageCalc()に

damageCalc(`${_montar}`)

のように引数を渡してdamageCalc()が動くようにしたいのですが、こうすると渡した引数が文字列と認識されてオブジェクトを引数として渡せません。どうすればオブジェクトのまま渡すことができますか?

0

2Answer

引数にオブジェクトを渡せばいいじゃんと答えるのは簡単です.
JavaScriptのコードを貼っているのにPlayFrameworkの話をしているので,まずどのような情報をクライアントとサーバーそれぞれで管理しているのか把握する必要があります.これがよく分からないようだと設計がままなりませんので,その辺をまず見直すべきです.

前回までに指摘しているようにPlay1系の変数展開はJavaScriptのそれと衝突しますし,システムの大部分をクライアントサイドに依存するなどでどうしてもJavaScriptを多用しなければならない場合は,他のフレームワークの使用を検討してください.

2Like

Comments

  1. 蛇足を承知で書きますが,そもそもの話クライアントサイドコードをバックエンドエコシステムから生成する(具体的にはscriptタグの中身をレスポンス処理時点で生成する)ようなデザインは,2昔前のCGIではよくありましたが,変数管理を困難にしますので今日日安易に取り入れるべきでないと思っています.
    現状デザイン的におそらくサーバー側で行うべき処理がかなりクライアント側に書かれていると推察しますし,その過程で必然的に変数管理の齟齬が生じているはずです.

    現在のプロジェクトの開発を急ぐ前に,WebAPIを用いたCRUDの基礎などについて一度モダンなフレームワークを用いて学習することを推奨します.

  2. @rempei

    Questioner

    ありがとうございます。参考にさせていただきます。

It seems like you are trying to pass an object as an argument to the damageCalc() function, but it's being treated as a string. To pass an object as an argument, you need to ensure that you're passing the actual object and not its string representation. Here's how you can do it:

Assuming _monstar is an object and you want to pass it to the damageCalc() function, you should directly pass the object itself without enclosing it in backticks (which are used for template literals to create strings).

Here's the corrected way to pass the object to the function:

// Assuming _monstar is an object
const _monstar = {
status: {
power: [/* some values /]
},
skill: [{
might: /
some value */
}]
};

// Call damageCalc() and pass the object directly
damageCalc(_monstar);
Then, within the damageCalc() function, you can access the object's properties as usual:

function damageCalc(_monstar) {
const attack = _monstar.status.power[0] * (_monstar.skill[0].might * 0.025);
const damage = attack - _pokomon.status.defense[0];
currentEnemyHP -= damage;

if (currentEnemyHP <= 0) {
enemyHPGauge.style.width = "0";
} else {
updateGauge(currentEnemyHP, maxEnemyHP, enemyHPGauge);
}
}
y directly passing the object without backticks, you ensure that the function receives the actual object reference, not a string representation.

Thank you.

0Like

Comments

  1. @rempei

    Questioner

    Thank you! I’d like to use your document as a reference.

Your answer might help someone💌