所以这就是我想要实现的目标: - 我有一个由Country类组成的模型,并存储一个名为Influence的值。 - 视图是名为CountryDisplay的类。这是一个GWT小部件,应始终显示给定国家/地区的当前影响。
public class Country {
private int influece;
private CountryDisplay display;
public Country() {
influence = 0;
}
public void setDisplay(CountryDisplay display) //...
public int getInfluence() //...
public void setInfluence(int value) {
influence = value;
display.update();
}
}
public class CountryDisplay {
private Country country;
public CountryDisplay (Country country) {
//GWT widget creating stuff
this.country = country;
}
public void update() {
//InfluenceCounter is a simple Label
InfluenceCounter.setText(Integer.toString(country.getInfluence()));
}
}
然后在EntryPoint类中我做了类似的事情:
Country italy = new Country();
CountryDisplay italyDisplay = new CountryDisplay(italy);
italy.setDisplay(italyDisplay);
RootPanel.get("nameFieldContainer").add(italyDisplay);
italy.setInfluence(3);
开发控制台表明它的行“display.update();”有问题。在国家。我的第一个猜测是问题是显示没有启动,所以我为它创建了一个接口,在Country构造函数中我创建了一个空的新显示,稍后会被覆盖。
public Country() {
influence = 0;
display = new DisplayInterface() {
public void update() {}
}
}
但我也没有这样的运气。我想这种交叉引用是不允许的?我的意思是视图将模型作为变量,反之亦然。 单独调用视图上的方法时(例如:
italy.setInfluence(3);
italyDisplay.displayTheCurrentValue();
)它有效,所以问题肯定在于观察者的逻辑。
答案 0 :(得分:0)
如果我理解正确,您正试图将用户界面元素(您的视图类CountryDisplay
)“绑定”到数据(模型类Country
)。 “绑定”是指如果您更改模型数据(例如,调用italy.setInfluence(10)
),则视图将自动更新以反映更改。如果您的视图提供了编辑器,您希望“绑定”也可以在另一个方向上工作。
有几个框架可以实现这一点,例如参见帖子Best data binding solution for GWT。我使用了GWT Pectin并且有GWT Editors framework(我还没有使用过它,因为它相对较新)。
查看您的代码,我觉得您可能希望更清楚地将模型与视图分开:您的模型类(Country
)不应该知道视图类,也就是说,它不应该存储引用到CountryDisplay
。