【问题标题】:Breezejs does not trigger knockout update if relation is deleted如果删除关系,Breezejs 不会触发淘汰更新
【发布时间】:2013-06-25 14:27:20
【问题描述】:

我在玩breezejs,但我遇到的问题是计算出的淘汰赛 observable 没有得到更新。让我用一个虚构的例子来解释:

我有一个实体 (Session) 与另一个实体 (Speaker) 具有一对多关系。我使用微风js中的扩展功能获取所有相关演讲者的所有会话:

breeze.EntityQuery.from('Sessions').expand('Speakers');

在微风管理器上,我在实体构造函数中配置了一个计算出的 observable:

var mgr = new breeze.EntityManager(config.remoteServiceName);
mgr.metadataStore.registerEntityTypeCtor('Session', null, sessionInitializer);

function sessionInitializer(session) {
    session.hasOldSpeaker = ko.computed(function () {
        for (var i = 0; i < session.speakers.length; i++) {
            var speaker = session.speakers[i];

            if (speaker.age() > 40) {
                return true;
            }
        }

        return false;
    });
}

然后我可以在视图中监听这个 observable:

<span data-bind="visible: session.hasOldSpeaker">....</span>

现在我有一个可以从会话中删除旧扬声器的按钮,这样我们就不再有任何旧扬声器了。我做了一个普通的ajax请求来做这个,因为它不仅仅是更新数据库,还必须做一些其他的工作,所以我认为我不能轻而易举地做到这一点。无论如何,工作完成后我告诉微风刷新实体:

var refreshQuery = breeze.EntityQuery.fromEntities(session).expand('Speakers');
manager.executeQuery(refreshQuery);

刷新似乎工作正常,因为会话的相关发言人列表现在是空的 - 但视图不会更新以隐藏上面的跨度。

有人知道为什么计算的绑定没有更新吗?

如果我刷新页面,那么它会正确隐藏跨度。

更新

在使用 Breeze 的 entityAspect.setDeleted 将会话的所有发言人标记为已删除进行测试后,我可以看到淘汰赛绑定按预期工作。所以我认为问题在于我刷新会话实体的方式。也许有人有更好的方法来使用这样的微风? - 这不仅仅是数据库更新,我还需要在服务器上启动一些工作。使用 Breeze 执行此操作的最佳方法是什么?

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

    据我所知,您的计算结果并不像让 Knockout 知道订阅 hasOldSpeaker 属性,只是订阅了说话者的年龄(如果您更改会话的说话者,这不会改变)

    因为您正在计算 hasOldSpeaker 属性并且仅订阅 age 属性,所以据我所知,只需更改会话或演讲者,它就不会订阅除了演讲者年龄之外的任何内容。将您的计算结果包装在 if 语句中应该正确订阅会话的扬声器属性。

    function sessionInitializer(session) {
        session.hasOldSpeaker = ko.computed(function () {
            if (session.speaker()) {
                for (var i = 0; i < session.speakers.length; i++) {
                    var speaker = session.speakers[i];
    
                    if (speaker.age() > 40) {
                        return true;
                    }
                    else { return false; }
                }
            }
    
            return false;
        });
    }
    

    【讨论】:

    • 感谢您的回答-您提出了一个很好的观点。我已经更新了我的计算,以便它也可以听扬声器。但是它仍然不起作用。作为测试,我尝试通过 Breeze 将所有扬声器标记为已删除 - 没有我的 Ajax 和刷新调用。当我这样做时 - 它有效! - 所以问题一定是我如何刷新会话实体。 Breeze 似乎没有正确刷新它
    • 如果您绕过浏览器中的微风和淘汰赛并将 Ajax 调用发送回 Web API 或其他任何内容,那么它们当然无法更新。你正在绕过他们。你能发布你的 Ajax 调用吗?
    猜你喜欢
    • 2013-09-15
    • 1970-01-01
    • 2016-03-15
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2017-05-17
    • 1970-01-01
    相关资源
    最近更新 更多