2

抱歉,如果这是重复的,但我正在浏览 Breezejs.com 上的文档,我想看看是否可以详细说明“最佳实践”

我正在使用 .extend 在父对象上加载一些导航属性。当我想将实体添加到该可观察数组时,我正在使用模式弹出窗口。我看到在调用模态的视图上添加了空白实体,但是当我在创建实体并保存可观察数组后关闭模态时不会更新,只会将主页的新实体留空。

http://www.breezejs.com/documentation/navigation-properties说在 Observable 数组中使用 .push() 会将对象添加到数组中,所以只是想知道我是否正确执行此操作或是否存在更好的方法。看起来很有趣的原因是我必须将实体从我的模态返回到我的父视图然后推送它,并认为也许有更好的方法。

编辑

从我的父视图模型中,我使用 Durandal.js 的 app.js 来显示一个模态。

var addComment = function () {
    rfcommentcreate.responseFormId(responseForm().id());
    app.showModal(rfcommentcreate).then(function (modalResult) {
        if (!modalResult) { datacontext.cancelChanges(); return false; }
        console.log(modalResult);  // Just to make sure the result is not null and of the right type
        responseForm.responseFormResponseFormComments.push(modalResult);
        return true;
    });
};

当我保存模式时,我将创建的对象传回。

    datacontext.saveChanges()
        .fail(initFailed)
        .fin(complete);

    function complete() {
        self.modal.close(responseFormComment());  // responseFormComment is the entity that I work on in the modal
    }

ResponseForm.ResponseFormResponseFormComments 是 ResponseForm 的导航属性。

上面的代码将实体添加到 Breeze 的实体管理器中,但 Knockout 在创建后并未对其进行跟踪。这似乎是一个真实的陈述,因为在我的父视图的 Html 中,我看到了类似这样的内容

:@

从 HTML 代码

<span data-bind="text: user().fullName"></span> : <span data-bind="text: message"></span> @ <span data-bind="DateTime: commentDt"></span>

在模态中创建实体后

根据breezejs.com 上的导航属性页面,如果我正确解释它应该可以工作。

A:它没有,并且可能是我的错 B:有没有更好的方法来跟踪导航属性而不必将它们“推”到一个数组中?

请注意,我们推送到 Orders 而不是 Orders()。

4

3 回答 3

2

不确定您在做什么,但您不需要重新查询或保存和刷新来获取您的实体。我猜你的视图模型有一些问题。尝试在没有任何 UI 的情况下执行添加/推送逻辑,看看问题是否消失。我的猜测是它会的。如果是这样,那么您需要仔细查看您的绑定逻辑。

于 2013-05-21T22:31:03.877 回答
2

KO可能存在时间问题。我知道这很笨拙,但您可以尝试以下方法(顺便说一句,我更改了函数参数的名称,因为modalResult对我来说不直观):

app.showModal(rfcommentcreate).then(function (comment) {
        if (!comment) { datacontext.cancelChanges(); 返回假;}
        控制台.log(评论);// 只是为了确保结果不为空且类型正确
        responseForm.responseFormResponseFormComments.push(comment);
        返回 Q.delay(true,5); // 5 ms 后返回 true 以获取另一个 JS 事件循环循环。
    });

我的建议在最后一行:

返回 Q.delay(true,5); // 5 ms 后返回 true 以获取另一个 JS 事件循环循环。

请参阅Q API 参考Q.delay中的方法。我正在做的是让 KO 有机会听到 Breeze 更新数组引发的事件并做出相应的响应。

如果有从ResponseFormCommentto的后退导航ResponseForm,不要以为我会推入导航属性(它真的被称为responseFormResponseFormComments“responseForm”两次吗?),并不是说这有什么问题。

我宁愿写:

评论.responseForm(responseForm); // 实体赋值

或者

评论.responseFormId(responseForm.id); // 外键赋值

responseForm两者都具有更新评论集合的预期副作用。

但回到主要问题......尝试延迟,让我们知道这是否有效。有时 KO 和 Breeze 会把他们的时间搞混。

于 2013-05-24T02:03:56.163 回答
1

感谢 Ward 的帮助,我能够更好地确定问题所在。不得不使用 .push 是一种解决方法,无论如何它并没有真正起作用。我的问题是我正在创建实体并在创建它时分配导航属性,而实际上我需要创建它然后分配导航属性 -

// *Goto the data context and create a 'comment' and assign the current user*    

rfcommentcreate.responseFormComment(datacontext.createResponseFormComment(shell.currentUser()));

// *Assign the navigation property back to the current responseForm after creation*

rfcommentcreate.responseFormComment().responseForm(responseForm());
// *Show the modal, while making edits in the modal Knockout is still bound back to the parent properly*

app.showModal(rfcommentcreate).then(function (comment) {
        if (!comment) { datacontext.cancelChanges(); return false; } // If user cancels the dialog cancel changes (actually probably not needed)
        return true;
    });

在我展示一个模式然后创建链接回传入的 responseForm 的评论之前,我认为它破坏了父级的 Knockout 绑定。

于 2013-05-24T15:03:07.583 回答