1

我们有一个利用部分页面 AJAX 更新的 ASP MVC 应用程序。当我们屏幕的一个面板上发生用户驱动的操作时,我们需要确保我们的 jsTree(在单独的面板中)更新。

但是,尝试在成功范围内采取行动:AJAX 调用的一部分不起作用 - 这发生得太早了,并且 jsTree 还没有准备好接受这些命令。稍后执行相同的命令就可以了。

我们已经通过以下方式解决了这个问题: - 在 AJAX 成功后,将所需的回调方法存储在新的 Javascript 类中:

var EPCStateMembers =
{
    _callbackMethod: "",

    StoreCallback: function (callbackMethod)
    {
        EPCStateMembers._callbackMethod = callbackMethod;
    },

    UseCallback: function ()
    {
        if (EPCStateMembers._callbackMethod != "")
            EPCStateMembers._callbackMethod();

        EPCStateMembers._callbackMethod = "";
    }
}

在 AJAX 成功后,我们调用 EPCStateMembers.StoreCallback()

然后,一旦 jsTree 准备就绪(由它自己的事件 reselect.jstree 指示)——我们调用

EPCStateMembers.UseCallback();

从功能上讲,此解决方案有效。

但是,在我们将自己交给临时 Javascript 状态存储作为我们的 goto 解决方案之前......我想问一个问题 - 这种情况是否存在更好的模式或实践?

4

1 回答 1

0

我同意它应该作为发生在树对象上的某种类型的 onload 事件存储和执行。

但是,由于这是经常发生的操作(改变 jstree)而不是一次性初始化的事情,也许 jstree 应该是担心自己的内部状态的人,并且应该在必要时自行排队改变请求。

我这么说只是因为我试图避免由于复杂的内部状态而具有复杂 api 的对象。当合理地设计出这种可能性时,我不喜欢担心 methodX 是否会失败或执行相当于 throw IllegalStateException 的操作。

另外,您可以使代码更加干燥。你不会有多次if(!tree.ready()) { queueit() }乱扔代码的情况,因为它可以在一个地方完成,封装它。

于 2012-06-14T22:12:40.860 回答