我有一个视图模型,它有一个通过 Breeze 检索到的 observableArray 实体。
// define the viewmodel
function episodesViewModel() {
this.episodes = ko.observableArray();
...
}
每个剧集实体都有一系列属性,我希望在页面加载时完整填充这些属性。然后,如何在从服务器检索和保存回服务器时仅更新其中一个属性?其他属性要大得多,并且将保持静态,因此没有必要通过网络来回发送它们。
我有一个视图模型,它有一个通过 Breeze 检索到的 observableArray 实体。
// define the viewmodel
function episodesViewModel() {
this.episodes = ko.observableArray();
...
}
每个剧集实体都有一系列属性,我希望在页面加载时完整填充这些属性。然后,如何在从服务器检索和保存回服务器时仅更新其中一个属性?其他属性要大得多,并且将保持静态,因此没有必要通过网络来回发送它们。
或者,您可以通过带外 AJAX 调用走传统路线。
添加您自己的响应 HTTP PATCH 的 Web API 控制器操作方法。你让它做正确的事。
Episode
使用更改的数据从客户端调用它(使用 jQuery AJAX 或 amplify.js) 。这是直接的 WebAPI/AJAX 编程。
如果用户直接对Episode
实体进行了更改,则您必须根据带外保存发生的情况进行调整。EntityManager.getChanges('Episode')
将从缓存中为您提供更改Episode
的实体。保存成功完成后,您可以在回调中调用以episode.entityAspect.acceptChanges
告诉 Breeze不再处于更改状态。EntityManager
episode
好问题!
我对你的第一个问题是“你确定额外的'静态属性'的有效负载重量实际上是一个问题吗?” 我不得不问你……就像我不得不问自己一样……因为我喜欢预测问题并过早地解决它们。在测量之后,我发现所有这些工作和担心对于现场应用来说真的无关紧要。请原谅我的无礼。
让我们假设您确实有问题。该episode
对象非常重(可能带有图像数据),您无法在模型中将其拆分为它们之间具有一对一关系的类Episode
。EpisodeDetail
你被一个又大又胖的Epsiode
班级困住了。我知道会发生这种情况。只是检查。
你可以做你想做的事。我想在 Breeze 中简化这种情况。今天有一种“OK”的方法(有些人可能称之为 hack)。我将在这里为您布置它的轮廓。你可以试试……让我们知道如何改进它。
在服务器上创建一个 DTO 类 ( EpisodeSaveDto
?),以表示Episode
您要保存的对象的形状。它必须具有Id
您要保存的 和 属性。
它不会是来自服务器的正常元数据的一部分,因为它不是一个真实的实体。因此,在您的 BreezeJS 客户端上的 JavaScript 元数据中描述该 DTO 对象。然后,Breeze 会将您EpisodeSaveDto
视为一个实体。有关此技术的示例,请参见“NoDb”示例。
创建实例EpisodeSaveDto
并用您的更改填充它们。您正在更新,而不是添加新实例,因此请在方法上使用 EntityState 设置签名createEntity
。
var episode = manager.createEntity("EpisodeDto", { id: origEpisode.id, foo: changedFooValue }, EntityState.Modified);
在服务器上,在您的自定义(派生)EFContextProvider
中,覆盖该BeforeSaveEntities
方法。此方法接收按类型排列的已更改实体的字典。
删除更改的集合EpisodeSaveDto
并将它们处理为适当Episode
的实体以进行保存。如果您没有使用 EF 或 SQL Db,那么您将在ContextProvider
... 的实现中再次执行此操作,如“NoDb”示例中所示。
将准备保存的Episode
实体集合添加到已更改实体的字典中,并将它们也附加到 EF 上下文。
服务器上的 Breeze.NET 会将您制造Episode
的实体保存在服务器上并忽略传入EpisodeSaveDto
(无论如何它都不知道如何保存)。
忏悔:我是凭记忆写的,我在第 6 步有点模糊。我相信你明白了。我们有点假装 Breeze.NET。
正如我在开始时所说,我想让这个场景变得更容易。我希望看到对可以接受和返回实体集的“命令”的内置支持。如果您认为我们应该这样做,请将您的投票添加到Breeze User Voice 。