Contextul evenimentului Knockout.js

Am început să reimplement un cod JS cu knockout.js. Am un singleton cu câteva funcții în el:

Dps = {
    someFunction: function() {
        this.anotherFunction();
    },
    anotherFunction: function() {
        console.log('tehee');
    }
}

Acum există și unele legături care numesc funcții ale acestui singleton:

<input type="text" data-bind="event: { change: Dps.someFunction }" />

The annoying thing is, that the context in the called function is the event, so I can't call this.anotherFunction()

Există o modalitate frumoasă de a scăpa de asta?

PS: Sunt conștient de faptul că aș putea să fac ceva ca Dps.someFunction (), dar acest lucru nu este frumos în opinia mea.

0

2 răspunsuri

Funcțiile dvs. se comportă ca "statice"

Deci, fie trebuie să faci Dps.anotherFunction, dar nu vrei asta, dar nu văd de ce.

De asemenea, puteți apela ko.applyBindings (Dps) și apoi codul dvs. ar funcționa bine. Totuși, cred că și asta nu e ceea ce căutați. Probabil că aveți un alt model de vizualizare împreună, nu?

O altă soluție este de a face Dps într-o funcție pe care o instanțiați

On jsfiddle: http://jsfiddle.net/PrbqZ/

<input type="text" data-bind="event: { change: myDps.someFunction }" />

var Dps = function() {
    var self = this;
    this.someFunction = function() {
        self.anotherFunction();
    };

    this.anotherFunction = function() {
        console.log('tehee');
    };
}

var myDps = new Dps();

//normally use dom ready, just simulating here
setTimeout(function(){
    ko.applyBindings();
}, 500)
0
adăugat

data-bind="event: { change: Dps.someFunction.bind(Dps) }"

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Funcție/bind

0
adăugat
Mulțumesc foarte mult, eu folosesc jQuery și exact asta căutam.
adăugat autor Julian Hollmann, sursa
Nu are suportul larg pentru browser. Cel mai notabil nu este suportat în IE8.
adăugat autor Martin Hansen, sursa
Ah ok, doar derulat în dreapta la tabelul de compatibilitate a browserului la partea de jos :)
adăugat autor Martin Hansen, sursa
@MartinHansen Drept, de aceea am legat articolul, astfel încât să puteți folosi codul care funcționează în IE6 +. Dacă utilizați jQuery, puteți folosi echivalentul lui jQuery: $ proxy (Dps.someFunction, Dps)
adăugat autor Esailija, sursa
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com