【发布时间】:2016-06-20 06:23:03
【问题描述】:
我目前正在尝试为棋盘游戏构建 Web 应用程序,并决定将 Aurelia JavaScript 框架用于前端。我是 Aurelia 的新手,在尝试单击按钮创建自定义组件的新实例时遇到了麻烦。让我通过展示我正在尝试完成的示例来进一步解释。我尝试实现的游戏设置如下:
我整理了一个最基本的示例来进一步解释我遇到的问题。这更像是一个设计问题,源于我对 Aurelia 的不熟悉,而不是其他任何事情。在这个最简单的示例中,我有主 app.js 视图模型和 app.html 视图,Aurelia 将其视为主视图模型和视图。它们看起来像这样:
app.js
import { Card } from './card';
export class App {
cards = [];
newCard() {
this.cards.push(new Card());
}
}
app.html
<template>
<require from="./card"></require>
<button click.delegate="newCard()">New Card</button>
<div>
<li repeat.for="card of cards">
<compose view-model="card"></compose>
</li>
</div>
</template>
然后我有一个卡片组件,它非常简单地代表一张扑克牌。这是它的视图模型和视图:
card.js
export class Card {
cardValues = ['2','3','4','5','6','7','8','9','10',
'J','Q','K','A'];
cardSuits = ['Diamonds', 'Clubs', 'Hearts', 'Spades'];
value;
suit;
activate() {
this.value = this.pickRandomItem(this.cardValues);
this.suit = this.pickRandomItem(this.cardSuits);
}
pickRandomItem(data) {
let index = Math.floor(Math.random() * (data.length -1));
return data[index];
}
}
card.html
<template>
<div style="border: 2px solid black;
display: inline-block;
margin-top: 10px;">
<h3>Value: ${value}</h3>
<h4>Suit: ${suit}</h4>
</div>
</template>
目前,我可以通过在应用视图模型的按钮单击事件处理程序中实例化一个新的 Card 对象,在应用视图中按下按钮时动态生成新卡片。我遇到的问题是我不相信我应该从应用程序视图模型中手动实例化 Card 对象。似乎应该有某种方法告诉 Aurelia 它需要创建一个新的 Card 对象,但我不知道那是什么方法。所以我的问题是:有没有更好的方法来动态创建自定义组件,而无需像我所做的那样手动实例化它们?
为什么这看起来不是正确的方法,我的部分原因是因为在当前设置下,Card 对象的构造函数被调用了两次,而构造函数只应该被调用一次。此外,如果 Card 类需要依赖注入值,我将不得不手动将这些值传递给新的 Card 对象,这对我来说并不合适。
非常感谢您的帮助!
这里是最小工作仓库on GitHub的链接
【问题讨论】:
-
你应该尽量让你的问题保持小而集中,这样其他人就可以很容易地理解这个问题,并且可以为他们自己的问题重复使用答案。请花一些时间将您的问题减少到尽可能小的重复。
-
好的,我将重写它以使其更简单,并制作一个新的最低限度的 Aurelia 项目并发布。我一直在思考我的应用程序上下文中的所有事情,但这是有道理的,谢谢!
-
看起来像辉煌:)
-
你是对的@MiroslavPopovic,这将是一个 Splendor 实现:)
标签: javascript mvvm typescript aurelia