JQuery调用Knockout ViewModel

时间:2012-11-28 16:54:11

标签: jquery knockout.js single-page-application

我几乎是Knockout的初学者 经过一段时间的工作,我追踪了一个小问题(我正在尝试建立一个移动SPA):

如果我在我的项目中绑定JQuery和Knockout,我的ViewModel会被调用两次:

  @{
        Layout=null;
    }

<head>
    <meta name="viewport" content="width=device-width" />
    <link rel="stylesheet" href="@Url.Content("~/Content/jquery.mobile-1.2.0.min.css")" />
    <link rel="stylesheet" href="@Url.Content("~/Content/Site.css")" />
    <script src="../../Scripts/jquery-1.8.3.js" type="text/javascript"></script>
    <script src="../../Scripts/jquery.mobile-1.2.0.js" type="text/javascript"></script>
     <script type="text/javascript">
         $(document).bind("mobileinit", function () {
             // As of Beta 2, jQuery Mobile's Ajax navigation does not work in all cases (e.g.,
             // when navigating from a mobile to a non-mobile page, or when clicking "back"
             // after a form post), hence disabling it.
             $.mobile.ajaxEnabled = false;
         });
    </script>

    @*jquery löst ViewMOdel aus*@

    <script type="text/javascript" src="../../Scripts/upshot.min.js"></script>
    <script type="text/javascript" src="../../Scripts/Upshot_Timeworx.js"></script>

    <script type="text/javascript" src="../../Scripts/knockout-2.2.0.js"></script>

</head>
<body>
    <!-- Login Seite -->
    <form data-bind="visible: userNotLoggedIn">  

        <label>Mandant</label><br /> <input data-bind="value: mandant" type="text" name="Mandant" />
        <br />
        <label>Benutzername</label><br /> <input data-bind="value: user" type="text" name="Benutzername"/>
        <br />
        <label>Passwort</label><br /> <input data-bind="value: password" type="password" name="Passwort"/>
        <br />

        <input type="button" value="Anmelden" name="login" data-bind="click: login" align="middle" />

    </form>
    <!-- ----------------------------------  -->


</body>
<script type="text/javascript">
    $(function () {
  function AppViewModel() {
            var self = this;
            var time = new Date();

            //Der User ist noch nicht angemeldet
            self.userNotLoggedIn = ko.observable(true);

            //Die Startseite wird versteckt
            self.showStart = ko.observable(false);

            //Die Detailseite wird versteckt 
            self.showDetails = ko.observable(false);



            //----------------------------------------------//
            //LogInSeite
            self.mandant = ko.observable("");
            self.user = ko.observable("");
            self.password = ko.observable("");

            //Überprüfen ob Passwort übereinstimmt
            self.login = function () {
                var pass = self.password();
                //alert(pass); Überprüfen ob das richtige passwort gespeichert wurde

                //!!!!!! ES MÜSSEN NOCH DIE ZUGANGSDATEN AUS DER DATENBANK EINGESETZT WERDEN!!!!!"
                if ((self.password() == "gregrech") && (self.user() == "Gregor")) {
                    //Code um die LogInSeite zu schließen 
                    //und die Startseite zu zeigen
                    //self.userNotLoggedIn(false);
                    self.showStart(true);
                    self.userNotLoggedIn(false);    //Die Log In Seite wird im Hintergrund versteckt

                }
                else {
                    alert("Username oder Passwort nicht korrekt");
                }

            }


            //Hier Endet der Knockout-Code für die LogIn-Seite
            //-------------------------------------------------------------------------------------------------------------------//


            //StartSeite
            self.details = function () {
                self.showStart(false);
                self.showDetails(true);
                //Funktioniert noch nicht
                //self.projectName = self.projectDetails.projectName();

            }
            //--------------------------------------------//

        ko.applyBindings(new AppViewModel);
    });
</script>

如果我尝试运行此代码,则表示警报的消息框会出现两次,但只会绑定JQuery mobile!

有谁知道我的问题是什么? 如果我尝试运行这个消息框形式警报来两次,但只有JQuery mobile绑定!

有谁知道我的问题是什么?

1 个答案:

答案 0 :(得分:0)

在jQuery移动页面isn't reliable中使用$(document).ready。这可能会导致您的问题。

在您当前的代码中,您通过调用隐式使用.ready:

$(function() { ...

相反,请使用pageinit event

$('#aboutPage').live( 'pageinit', function(event) {
   // Create and bind your Knockout view model here.
});