无法更新属性并更改 Breeze 中其他属性的 TimeZone

Posted

技术标签:

【中文标题】无法更新属性并更改 Breeze 中其他属性的 TimeZone【英文标题】:can't update attribute and change the TimeZone for other attribute in Breeze 【发布时间】:2015-09-27 14:35:07 【问题描述】:

在激活我的编辑视图页面时,我正在尝试使用外键从不同的表中获取实体,但我认为这不是获取和更新实体的正确方法,它不会保存更新的属性“modification_date”和我面临的另一个问题是时间问题,因为我有一个属性“startDate”,它是日期时间类型,所以当我将我的应用程序托管到某个 VM 时,它显示的时间是 +5:30 的时间原始值,因为数据库将值存储在 GMT +00:00 中。我怎么解决这个问题? 我的问题是:

    为什么“modification_date”不保存当前日期,无论何时更新实体。
 <input data-bind="value: modificationDate = $root.md, visible: false"
>

javascript

vm.md = ko.dependentObservable(function () 
        var y = new Date();// should assign current to modification date but its not persisting the changes to database.
        return y;
        , vm);

    当我的当前时间是 GMT +5:30 时,如何向客户端显示 GMT +00:00 的正确时间。在从 SqlServer 编辑和获取数据时。

    请评论我们如何使用导航键访问另一个表,因为我正在做的是获得一个可观察的“作业”,并且存在不同的属性,另一个表是“job_Schedule”,所以我应该怎么做访问“job_Schedule”表下的属性 startDate。目前我正在访问的是job_Schedule._latestValue[0].startDate,这可能不是获取实体的正确方法。

这是我的一段代码:

 <div data-bind="with: job">
<label>Start Date :</label>
                        <input data-bind="kendoDateTimePicker: $root.temp3" />
                        <input data-bind="value: job_Schedule._latestValue[0].startDate = $root.tempSD1, visible: false" />
     <input data-bind="value: modificationDate = $root.md, visible: false" >
//I kept visible: false because modified date should be updated automatically
// some more attributes................
</div> 

Javascript 代码

    vm.md = ko.dependentObservable(function () 
    var y = new Date();// should assign current to modification date but its not persisting the changes to database.
    return y;
    , vm);

vm.tempSD = ko.dependentObservable(function () 
    var y = ko.unwrap(this.tempx());// tempx containing the current value of startDate
    if (y === null || y === '""')  y = new Date(); 
    y = new Date(y);
    var utc = y.getTime() + (y.getTimezoneOffset() * 60000);
    temp3(new Date(utc));
    return new Date(utc);
, vm);

vm.tempSD1 = ko.computed(function () 
    var y = vm.temp3();
    if (y === null || y === '""') y = new Date();
    y = new Date(y);
    var utc = y.getTime() - (y.getTimezoneOffset() * 60000);
    return new Date(utc);
,vm);

【问题讨论】:

什么是修改日期?为什么要在绑定表达式而不是 JavaScript 中设置它? 那我该如何在javaScript中实现呢?因为“modificationDate”是数据库中的一列。 vm.job.modificationDate(new Date()); 假设 vm.job 是具有 modificationDate 属性的 Breeze 实体。 不,我们不能那样做,我已经试过了,它会显示错误Failed to load routed module (viewmodels/jobedit). Details: vm.job.modificationDate is not a function 啊,我看到 vm.job 是一个 observable。所以应该是vm.job().modificationDate(new Date()); 【参考方案1】:

日期操纵对于每项技术的每个人来说都是一个长期存在的挑战。

时区操作特别棘手,尤其是当客户端和服务器位于不同时区时。

当您可以确保所有日期都已创建并存储在UTC 中时,这可能不会成为问题。我认为您不想完全依赖对new Date() 的调用。

我建议查看momentjs date/time library。

我不知道如何解决您关于导航到相关实体的问题,因为您没有提供有关所涉及的实体类型或其关系的任何信息。这是一个单独的问题吗?或者您的导航属性和您的日期问题之间是否存在联系?

【讨论】:

谢谢沃德,让我重新提出这个问题,我想知道我得到的实体来自 2 个表“Job_Details”和“Job_Schedule”,其中 Job_Schedule 有一个外键“ JobID' 并以此为基础,我将两个表中的数据填充到 'job' observable 中,并且这个 observable 包含我需要的一切。现在的问题是Am I using correct syntax to access the 'job_Schedule' entities?,因为我在我的视图中访问它,比如job_Schedule._latestValue[0].startDate 如果有另一种最好的方法,我准备好遵循它。为了获得更多参考,我发布了 observable 的图像,以便您清楚地了解填充到我的 observable 中的数据结构。 请检查我用我的工作 Observable 的图像更新了我的帖子

以上是关于无法更新属性并更改 Breeze 中其他属性的 TimeZone的主要内容,如果未能解决你的问题,请参考以下文章

Breeze 正在尝试更新计算的数据库列

调试breeze js实体状态

[DataGridCheckBoxColumn在属性更改时不会在MVVM中更新

结合@Published 属性:在更新期间从其他地方获取当前值

错误:将 Android Studio 更新到 3.2 后,无法更改配置 ':android:kapt' 的属性

计算属性未在道具更改时更新