我如何将我的微风实体包装在一个视图模型中,这个视图模型有一些作为可观察对象暴露的属性



我有一个来自Breeze的实体,它可能有20个左右的属性,但是我想把这个实体包装在一个视图模型中,并且只把那几个属性作为ko.observable()公开。我如何管理所有做属性更改通知?

在c#中,我会这样做:
public double OtherSalesPercent
{
 get { return Model.OtherSalesPercent; }
 set 
 { 
  if (Model.OtherSalesPercent != value)
  {
   Model.OtherSalesPercent = value;
   OnPropertyChanged("OtherSalesPercent");
  }
 }
}

杰伊,谢谢你的回复。我知道beeze会这么做。但是,我不希望我的视图直接绑定到实体,而是绑定到视图模型。想想一个叫苹果的视图。苹果显示了苹果视图模型的列表。每个apple实体有30个不同的属性,但我只想在apple视图模型上公开这30个属性中的3个。我想创建3ko。apple视图模型上的可观察属性,它将显示apple实体上的这3个属性。到目前为止,我所拥有的是"工作",但我认为它不是最干净的。下面是name属性:

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;
};  

但这对我来说似乎是错的。我想要双向绑定。当我改变viewmodel name属性时它会改变后台实体名称。如果我改变后台实体名称,它会更新viewmodels name属性。

谢谢!

我想这就是你要找的ko.computed:

var data = {
    OtherSalesPercent: 0.99
};

function Model(data) {
    this.OtherSalesPercentValue = ko.observable(data.OtherSalesPercent);
    this.OtherSalesPercent = ko.computed({
        read: function () { 
            return Model.OtherSalesPercentValue(); 
        },
        write: function (value) {
            if (this.OtherSalesPercentValue() != value) {
                this.OtherSalesPercentValue(value);
            }
        },
        owner: this
    });
}

如果我已经理解了你的问题,你有几个选择。

首先,默认情况下,breeze根据你所选择的'modelLibrary'的约定,使每个实体属性都成为'observable'。所以,只是为了清楚,如果你检索的数据,微风识别为一个实体,和微风的模型库是'ko'(默认如果你没有配置一个),那么每个实体属性将是一个knockout可观察对象自动。

这只发生在你的查询返回'entities'时。Breeze通过在客户端MetadataStore中查找相应的entityType来确定查询结果是否包含实体。

如果返回的数据不是一个实体或实体的集合,那么breeze只返回原始数据。如果只对选定的字段执行投影,就会发生这种情况。例如

var query = EntityQuery.from("Orders").select("customer, orderDate");

在这种情况下,promise回调中返回的查询结果中的每一项都将是一个具有两个简单属性的对象,一个'customer'和一个'orderDate',这两个属性都不是可观察的。

根据你的问题,我想知道你是否想要做的只是向客户端公开每个服务器端实体的子集,但仍然希望更改管理和可观察性。如果是这种情况,您可以让您的服务器端方法返回DTO,然后通过指定关于每个DTO形状的元数据告诉breeze客户端这些是"entityTypes"。通过使用MetadataStore,在客户端上最容易做到这一点。addEntityType方法,用于计划返回的每个DTO形状。breeze文档详细介绍了这个主题。

我不确定这是否是你想要的,但是…

相关内容

  • 没有找到相关文章

最新更新