【问题标题】:ko.applyBindings gives error "ko is not defined" when using ko in view在视图中使用 ko 时,ko.applyBindings 给出错误“ko 未定义”
【发布时间】:2013-09-21 07:10:34
【问题描述】:

我的 MVC 布局中有以下内容(在底部):

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/knockout")
@Scripts.Render("~/bundles/viewmodels")

我在开发人员工具的“源”选项卡中看到淘汰赛加载。

在我的一个观点中,我必须做到以下几点:

<script type="text/javascript">ko.applyBindings(@Html.Raw(Json.Encode(Model)));</script>

但这给了我一个错误:ko is not defined

为什么会发生这种情况,尽管已经加载了淘汰赛?

【问题讨论】:

  • 您是否在应用程序的某个地方使用了像 require.js 这样的 AMD 加载程序?
  • 不,我不是...我只是在我的布局中有渲染,然后在视图中引用了 ko。
  • 你能发布“查看源代码”输出的样子吗?
  • 对不起...我刚刚将渲染(敲除)移动到我的布局页面的顶部,它就开始工作了。我现在遇到了另一个问题:stackoverflow.com/questions/18840173/…

标签: asp.net-mvc asp.net-mvc-3 knockout.js


【解决方案1】:

问题是我的视图是在淘汰赛之前加载的。将它推到我的 Layout.cshtml 的顶部:

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/knockout")

解决了这个问题。

【讨论】:

  • 由于您使用的是jquery,您可以利用jquery 的ondom ready 功能并在其中添加ko 引用和绑定。这样,即使您需要将引用保留在视图下方(出于性能原因,这是一个好主意),javascript 解析器也不会抱怨。
  • @Yogesh 您能否提供一个示例来说明如何做到这一点?我对淘汰赛和客户端脚本也有点菜鸟
【解决方案2】:

您也应该将 @ko.Apply(Model) 放在页面底部,而不是在页面顶部拉脚本。

以下代码将解决您的问题

@section scripts{
    @ko.Apply(Model)
}

记得在布局视图上声明一个scripts部分,否则会导致异常

@RenderSection("scripts", required: false)

【讨论】:

    【解决方案3】:

    我通过删除 Index.cshtml 文件末尾的脚本行解决了我的问题:

    <script src="~/Scripts/ConfigGroup.js"></script>
    

    并将其替换为:

    @section Scripts {
        @Scripts.Render("~/Scripts/ConfigGroup.js")
    }
    

    我猜脚本部分的加载时间与包含的时间不同。

    现在我提到 ko。在 ConfigGroup.js 脚本中不再有错误

    【讨论】:

      【解决方案4】:

      在我的场景中,@RobVious answer 是一部分但未完成。我按照这些步骤解决了问题。

      1. 将以下部分添加到共享布局的标题 &lt;head&gt; 中(例如 _Layout.cshtml

        @Scripts.Render("~/bundles/jquery") @Scripts.Render("~/bundles/bootstrap") @Scripts.Render("~/bundles/knockout")

      2. 然后将敲除代码添加到文档就绪标记,如下所示。

        $(document).ready(function () { function AppViewModel() { this.firstName = "Bert"; this.lastName = "Bertington"; } ko.applyBindings(new AppViewModel()); });

      3. 如果这不起作用,请使用检查元素检查您的 knockout.js 是否正在加载,如下所示

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-30
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 2013-04-01
        • 1970-01-01
        • 2017-05-04
        相关资源
        最近更新 更多