【问题标题】:In a Durandal viewmodel, the view isn't always attached when viewAttached() called在 Durandal 视图模型中,调用 viewAttached() 时并不总是附加视图
【发布时间】:2013-05-04 08:23:18
【问题描述】:

我在 Durandal 有一个 ViewModel,它有一个函数 viewAttached()

根据the docs,这应该在视图附加到 DOM 后调用。

在我的函数中,我有一个用于附加视图中的元素的 jQuery 选择器:

function viewAttached() {
    console.log( $("#myViewId").length );
}

大多数情况下,我正确地将“1”打印到控制台,但可能有 10% 的情况下我得到 0。视图实际上还没有附加到 DOM。

有其他人遇到过这个问题吗?

【问题讨论】:

    标签: javascript mvvm durandal


    【解决方案1】:

    viewAttached 获取作为参数传入的生成的 DOM 子树。

    所以你可以将代码更改为类似的东西

    function viewAttached(view) {
        console.log( $(view).length );
    }
    

    如果你想用 jQuery 或者包裹整个视图

    function viewAttached(view) {
        console.log( $(view).find('mySubSelector').length );
    }
    

    如果您需要使用某些特定的子树元素。

    【讨论】:

    • 是的,这正是我最终所做的。幸运的是我可以,因为代码是我自己的,但是还有一些其他的 jQuery 库在内部使用 $(...) 来做事,总是假设你的元素将在主 DOM 上。它的不一致是真正搞砸了我。如果它始终打开或始终关闭 DOM,至少它会是一致的 :)
    • 那么当您尝试访问它时,您的父级是否已经在 DOM 中?根据文档:“这允许控制器或演示者在注入其父级后的某个时间点直接访问它所绑定的 dom 子树。”
    【解决方案2】:

    有几点需要注意:

    1. viewAttached 在当前模块的视图附加到它的直接父级后触发,这不一定是在它附加到 DOM 时。在某些情况下,这是一个明显的限制。对于 Durandal 2.0,我们添加了一个名为 documentAttached 的额外回调,它会在所有内容都附加到页面的 dom 时触发。

    2. viewAttached 被传递给当前模块的视图。您应该使用它为您编写的任何 jQuery 代码提供上下文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多