我有一个来自 Breeze 的实体,它可能有 20 个左右的属性,但是我想将该实体包装在一个视图模型中,并且只将这几个属性公开为 ko.observable()。我如何管理所有进行属性更改通知?
在 c# 中,我会做这样的事情:
public double OtherSalesPercent
{
get { return Model.OtherSalesPercent; }
set
{
if (Model.OtherSalesPercent != value)
{
Model.OtherSalesPercent = value;
OnPropertyChanged("OtherSalesPercent");
}
}
}
更新 杰伊感谢您的回复。我知道 beze 可以做到这一点。但是,我不希望我的视图直接绑定到实体,而是视图模型。所以想想一个叫做苹果的观点。苹果正在显示苹果视图模型列表。每个苹果实体都有 30 个不同的属性,但我只想在苹果视图模型上公开这 30 个属性中的 3 个。所以,我想在苹果视图模型上创建 3 个 ko.observable 属性,这些属性将在苹果实体上显示这 3 个属性。到目前为止我所拥有的是“工作”,但我认为它不是最干净的。这是名称属性:
var appleViewModel = function(appleEntity) {
var backingEntity = appleEntity;
var name = ko.observable(locationEntity.name());
name.subscribe(function(newValue) {
backingEntity.name(newValue);
});
var vm = {
name: name
};
return vm
};
另一个重要原因是我正在使用 jqxGrid,但它们在绑定到 Breeze 实体时遇到问题。所以我真正想要的是一个可以显示这些属性的 appleViewModel,但是,如果我更改实际的苹果实体(如在 cancelChanges 中),我希望 UI 从实体中获取该更改)。
更新 2
这似乎给了我我想要的一切并绑定到 jqxGrid
var createViewModel = function(appleEntity) {
var entity = appleEntity;
var name = ko.observable(entity.name());
name.subscribe(function(newValue) {
entity.name(newValue);
});
entity.name.subscribe(function(newValue) {
name(entity.name());
});
var vm = {
name: name
};
return vm;
};
但这对我来说似乎是错误的。我基本上想要双向绑定。因此,当我更改视图模型名称属性时,它会更改支持实体名称......如果我更改支持实体名称,它将更新视图模型名称属性。
谢谢!