开发者

Default values in ko.observable property not showing

I am trying out knockoutjs at the moment, with my fairly rudimentary knowledge of javascript. I have set up a basic ASP.NET MVC 3 app for this purpose. Here's the snippet I set up in the Home/Index.cshtml view:

@if(false)
{
    <script src="../../Scripts/jquery-1.6.3.js" type="text/javascript"></script>
    <script src="../../Scripts/knockout-1.3.0beta.debug.js" type="text/javascript"></script>
}

@{
    ViewBag.Title = "Home Page";
}

<script type="text/javascript">
    var entryDataViewModel = {
        registration: ko.observable("Registration"),
        registeredName: ko.observable("Name"),
        entryClass: ko.observable("Junior")
    };

    ko.applyBindings(entryDataViewModel);
</script>

<h2>@ViewBag.Message</h2>
<p>
    Registration: <span data-bind="text: registration"></span><br />
    Name: <span data-bind="text: registeredName"></span><br />
    Class: <span data-bind="text: entryClass"></span><br />

    To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>

For some weird reason nothing is showing, not even the default values. If I debug through Firebug the ViewModel is showing the properties as being empty too. Have I missed something here?

Many thanks, Dany.

ADDED: the content of the _Layout.cshtml - it's all stock standard stuff, except for the addition of knockout, and using jquery 1.6.3

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/knockout-1.3.0beta.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery-1.6.3.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
</head>
<body>
    <div class="page">
        <header>
            <div id="title">
                <h1>My MVC Application</h1>
            </div>
            <div id="logindisplay">
                @Html.Partial("_LogOnPartial")
            </div>
            <nav>
                <ul id="menu">
                    <li>@Html.开发者_Python百科ActionLink("Home", "Index", "Home")</li>
                    <li>@Html.ActionLink("About", "About", "Home")</li>
                </ul>
            </nav>
        </header>
        <section id="main">
            @RenderBody()
        </section>
        <footer>
        </footer>
    </div>
</body>
</html>


The answer I voted above only worked when I tried it in a plain webpage - not when I tried it in my MVC view. As it turned out I put the script block in the wrong position. I moved it to the end of the view, after the page elements have been processed. The other option is to wrap it within $(document).ready() then you can put the script block containing ViewModel and call to ko.applyBindings() anywhere you want...


use $(document).load(function(){:

<script type='text/javascript'> 
  //<![CDATA[ 
  $(document).load(function(){
  var entryDataViewModel = {
        registration: ko.observable("Registration"),
        registeredName: ko.observable("Name"),
        entryClass: ko.observable("Junior")
    };

    ko.applyBindings(entryDataViewModel);
  });
  //]]> 
  </script> 

Have a look: http://jsfiddle.net/S8Rh5/ - it works just fine.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜