| 

.NET C# Java Javascript Exception

1
Hallo
Mir ist ein etwas wiedersprüchliches Problem aufgefallen als ich heute auf knockout 2.0 gewechselt habe und dabei meine dependentObservables zu computed umgebaut habe.

Ich bekammt promt einen Fehler:
this.xyz is not a function

Aufgetreten war der Fehler innerhalb eines computed. Es lag daran dass xyz ebenfalls ein computed war, aber erst später im Code definiert wurde. Doch bisher hatte es doch auch funktioniert?

Ich habe also auf jsfiddle ein Beispiel angelegt um etwas zu testen. Und siehe da: Dort tritt das Problem auch mit dependentObservables auf.

http://jsfiddle.net/mzkDX/11/

Immer wenn innerhalb des JS Codes fieldAddTwo vor fieldAddOne definiert wird kommt es zu diesem Problem. Ich würde es ja einsehen wenn das immer der Fall wäre, doch in meinem anderen Code (der prinzipiell gleich aufgebaut ist) funktioniert es auch ohne die richtige Reihenfolge einhalten zu müssen. Das verwirrt mich nun doch zunehmens. Wo liegt mein Denkfehler?

Danke für jede Hilfe
Gruss
News:
16.01.2012
philipooo 124 5
1 Antwort
0
Hm, hilfreich wäre es natürlich, wenn Du den "anderen Code (der prinzipiell gleich aufgebaut ist)" posten würdest. Eine denkbare Erklärung wäre, dass Du dort die Funktionen nicht innerhalb des Konstruktors definierst, sondern über das prototype-Objekt. Dann existieren sie schon a priori, und wenn (wie es den Anschein hat) KO beim Definieren von fieldAddTwo() innerhalb des Konstruktoraufrufs schon mal den aktuellen Wert für fieldAddTwo zu bestimmen versucht, dann findet es fieldAddOne, während es in Deiner geposteten Version noch gar nicht definiert ist.

Update, nachdem ich mir die KO-Doku nochmal genau angesehen habe: über Model.prototype ein computed bzw. dependentObservable zu definieren, dürfte wegen des besonderen Umgangs mit "this" wohl nahezu unmöglich sein (wenn nicht, wäre ich gespannt zu erfahren, wie es geht). Also wird es wohl an was anderem liegen. Wie gesagt: poste mal den funktionierenden Code. Aus dem beschriebenen Grund (initialer Wert für Observables wird sofort bestimmt) ist es für mich eher "normal", dass der gepostete Code nicht funktioniert, als dass ein (wirklich) analoger Code funktionieren sollte. Das paßt auch zur Doku:
The tracking algorithm goes like this:
1. Whenever you declare a computed observable, KO immediately invokes its evaluator function to get its initial value.
16.01.2012
Matthias Hlawatsch 8,4k 2 8
Der andere Code ist leider zu umfangreich um ihn hier zu posten. Aber es sei gesagt, dass er in seinen Bestandteilen so aufgebaut ist wie der obige. Einziger Unterschied der evtl. eine Rolle spielen könnte ist, dass ich in dem anderen Code ko.mapping verwende um das Model zu konstruieren. Leider lässt sich das ko.mapping.js File nicht in jsfiddler einbinden. Werde das mal lokal testen.

Danke schonmal für deine Hilfe.
philipooo 16.01.2012

Stelle deine Javascript-Frage jetzt!