【发布时间】:2016-01-12 13:37:35
【问题描述】:
我正在寻找的是一种实现模板的方法,其中模板只知道视图模型的接口。
假设我有一个名为 Greetings 的视图。它知道它可以与一个名为 IGreetingsVM 的接口进行通信。
IGreetingsVM 可能类似于:
interface IGreetingsVM {
greetings: KnockoutObservable<string>;
}
在实际的视图模型中我实现了接口:
class GreetingsVMImpl implements IGreetingsVM {
greetings: KnockoutObservable<string>;
constructor() {
this.greetings("Hello world");
}
}
既然模板知道它有一个IGreetingsVM,它也知道它可以调用greeting,所以:
<p data-bind="text: greetings"></p>
通过这种方式,我可以将整个视图与实际的视图模型实现分开。
但是,在我见过的大多数示例中,他们通常说这个模板必须有这个 viewmodel 实现。
这可以在示例 Java 中实现,其中您为创建的每个表单都有一个代码隐藏文件,您可以在其中为视图模型设置一个 get 和 set 方法。
例子:
public class Greeter extends JPanel {
public static final string PROP_VIEWMODEL = "viewModel";
private IGreetingsVM viewModel;
private JLabel greetingLabel;
private BindingGroup bindingGroup;
public Greeter() {
initComponents();
}
public void setViewModel(IGreetingsVM viewModel) {
IGreetingsVM oldViewModel = this.viewModel;
this.viewModel = viewModel;
propertyChangeSupport.firePropertyChange(PROP_VIEWMODEL, oldViewModel, viewModel);
}
public IGreetingsVM getViewModel() {
return this.viewModel;
}
private void initComponents() {
bindingGroup = new BindingGroup();
greetingLabel = new JLabel();
Binding binding = Bindings.createAutoBinding(
AutoBinding.UpdateStrategy.READ_WRITE,
this,
ELProperty.create("${viewModel.greetings}"),
greetingLabel,
BeanProperty.create("text"));
// similar to knockout where bindings auto update components.
bindingGroup.addBinding(binding);
}
}
有没有办法在 javascript 中实现 ^,最好是通过敲除?
【问题讨论】:
标签: javascript knockout.js typescript viewmodel