1

我有一个视图模型,它有一个通过 Breeze 检索到的 observableArray 实体。

// define the viewmodel
function episodesViewModel() {

this.episodes = ko.observableArray();
...
}

每个剧集实体都有一系列属性,我希望在页面加载时完整填充这些属性。然后,如何在从服务器检索和保存回服务器时仅更新其中一个属性?其他属性要大得多,并且将保持静态,因此没有必要通过网络来回发送它们。

4

2 回答 2

1

或者,您可以通过带外 AJAX 调用走传统路线。

添加您自己的响应 HTTP PATCH 的 Web API 控制器操作方法。你让它做正确的事。

Episode使用更改的数据从客户端调用它(使用 jQuery AJAX 或 amplify.js) 。这是直接的 WebAPI/AJAX 编程。

如果用户直接对Episode实体进行了更改,则您必须根据带外保存发生的情况进行调整。EntityManager.getChanges('Episode')将从缓存中为您提供更改Episode的实体。保存成功完成后,您可以在回调中调用以episode.entityAspect.acceptChanges告诉 Breeze不再处于更改状态。EntityManagerepisode

于 2013-02-24T21:32:14.910 回答
0

好问题!

我对你的第一个问题是“你确定额外的'静态属性'的有效负载重量实际上是一个问题吗?” 我不得不问你……就像我不得不问自己一样……因为我喜欢预测问题并过早地解决它们。在测量之后,我发现所有这些工作和担心对于现场应用来说真的无关紧要。请原谅我的无礼。

让我们假设您确实有问题。该episode对象非常重(可能带有图像数据),您无法在模型中将其拆分为它们之间具有一对一关系的类EpisodeEpisodeDetail你被一个又大又胖的Epsiode班级困住了。我知道会发生这种情况。只是检查。

你可以做你想做的事。我想在 Breeze 中简化这种情况。今天有一种“OK”的方法(有些人可能称之为 hack)。我将在这里为您布置它的轮廓。你可以试试……让我们知道如何改进它。

  1. 在服务器上创建一个 DTO 类 ( EpisodeSaveDto?),以表示Episode您要保存的对象的形状。它必须具有Id您要保存的 和 属性。

  2. 它不会是来自服务器的正常元数据的一部分,因为它不是一个真实的实体。因此,在您的 BreezeJS 客户端上的 JavaScript 元数据中描述该 DTO 对象。然后,Breeze 会将您EpisodeSaveDto视为一个实体。有关此技术的示例,请参见“NoDb”示例

  3. 创建实例EpisodeSaveDto并用您的更改填充它们。您正在更新,而不是添加新实例,因此请在方法上使用 EntityState 设置签名createEntity

    var episode = manager.createEntity("EpisodeDto",
       { id: origEpisode.id,
         foo: changedFooValue },
       EntityState.Modified);
    
  4. 在服务器上,在您的自定义(派生)EFContextProvider中,覆盖该BeforeSaveEntities方法。此方法接收按类型排列的已更改实体的字典。

  5. 删除更改的集合EpisodeSaveDto并将它们处理为适当Episode的实体以进行保存。如果您没有使用 EF 或 SQL Db,那么您将在ContextProvider... 的实现中再次执行此操作,如“NoDb”示例中所示。

  6. 将准备保存的Episode实体集合添加到已更改实体的字典中,并将它们也附加到 EF 上下文。

服务器上的 Breeze.NET 会将您制造Episode的实体保存在服务器上并忽略传入EpisodeSaveDto(无论如何它都不知道如何保存)。

忏悔:我是凭记忆写的,我在第 6 步有点模糊。我相信你明白了。我们有点假装 Breeze.NET。

正如我在开始时所说,我想让这个场景变得更容易。我希望看到对可以接受和返回实体集的“命令”的内置支持。如果您认为我们应该这样做,请将您的投票添加到Breeze User Voice 。

于 2013-02-24T21:23:40.010 回答