Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JQuery Mobile/Knockout]Binding probleem na navigatie

Pagina: 1
Acties:

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Ik heb een probleem met Knockout in combinatie met JQuery Mobile. Ik heb een pagina met een eenvoudige binding en een link naar een andere pagina ook met JQuery Mobile en Knockout. De pagina's los werken prima, maar als ik via de link naar de andere pagina navigeer krijg ik een JS error dat hij de bindings niet kan parsen, omdat nog niet het juiste viewmodel geladen is. Dit komt natuurlijk omdat JQuery mobile de nieuwe pagina binnen de huidige context laad, en knockout dus nog actief is.

Ik heb twee paginas ( Foo.html en Bar.html )

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--Foo.html-->
<div data-role="page" id="foo">
    <div data-role="content">
        <div data-bind="text: Foo"></div>
        <a href="Bar.html">Bar</a>
    </div>
</div>
<script type="text/javascript">
    $('[data-role="page"]').live('pageshow', function () {
        var viewmodel = {
            "Foo": ko.observable("Foo")
        };
        ko.applyBindings(viewmodel);
    });
</script>

en
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- Bar.html -->
<div data-role="page" id="bar">
    <div data-role="content">
        <div data-bind="text: Bar"></div>
        <a href="Foo.html">Foo</a>
    </div>
</div>
<script type="text/javascript">
    $('[data-role="page"]').live('pageshow', function () {
        var viewmodel = {
            "Bar": ko.observable("Bar")
        };
        ko.applyBindings(viewmodel);
    });
</script>

Als ik nou van Foo.html via de link naar Bar.html navigeer gaat het mis en krijg ik de volgende error in mijn Chrome console
Uncaught Error: Unable to parse bindings.
Message: ReferenceError: Bar is not defined;
Bindings value: text: Bar
Ik heb gezocht op google naar "Unable to parse bindings" en combinaties van JQuery Mobile en Knockout, maar kon geen oplossing voor dit probleem vinden.

Het kan toch niet zo zijn dat ik voor het navigeren eerst Knockout moet disablen op een of anderen manier? Heeft iemand een idee hoe ik dit op de juiste manier kan laten werken?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Nee die had ik nog niet gevonden. Het lijkt dat ze een wat ander probleem op proberen te lossen, maar ik zal eens kijken of ik daarmee wat wijzer word.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Mottebelke
  • Registratie: Juni 2001
  • Laatst online: 21-11 15:59
Het probleem is dat je pageshow functie van de Foo pagina ook wordt aangeroepen als de Bar pagina is geladen, omdat je selector alle elementen met data-role="page" selecteerd. En daarom probeert ie het Foo viewmodel te binden aan de Bar pagina.

Je kunt dit oplossen door je pageshow functies specifiek voor die pagina te zetten en door applyBindings een tweede parameter te geven die aangeeft wat de context moet zijn (oftewel, in welk DOM element de bindings moet worden gedaan):

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--Foo.html--> 
<div data-role="page" id="foo"> 
    <div data-role="content"> 
        <div data-bind="text: Foo"></div> 
        <a href="Bar.html">Bar</a> 
    </div> 
</div> 
<script type="text/javascript"> 
    $('#foo').live('pageshow', function () { 
        var viewmodel = { 
            "Foo": ko.observable("Foo") 
        }; 
        ko.applyBindings(viewmodel, $('#foo')[0]); 
    }); 
</script>

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- Bar.html --> 
<div data-role="page" id="bar"> 
    <div data-role="content"> 
        <div data-bind="text: Bar"></div> 
        <a href="Foo.html">Foo</a> 
    </div> 
</div> 
<script type="text/javascript"> 
    $('#bar').live('pageshow', function () { 
        var viewmodel = { 
            "Bar": ko.observable("Bar") 
        }; 
        ko.applyBindings(viewmodel, $('#bar')[0]); 
    }); 
</script>

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Bedankt voor je antwoord, het werkte eerst nog niet helemaal, maar dat kwam omdat het script buiten de page div stond, en dus niet goed ingeladen werd. Als het script binnen de page div staat werkt jouw oplossing inderdaad wel goed.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”