Loggfila feil kontekst dette

stemmer
7

Kode:

export class ViewModel {
        public users: knockout.koObservableArrayBase;

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = this.removeUser.bind(this);//<-- Here compiller shows error
        }

        removeUser(user: User): void {
            this.users.remove(user);
        }
}

html:

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Surname</th>
        </tr>
    </thead>
    <tbody data-bind=foreach: users>
        <tr>
            <td><a href=# data-bind=click: $root.removeUser>Remove</a></td>
            <td data-bind=text: name></td>
            <td data-bind=text: surname></td>
        </tr>
    </tbody>
</table>

Problemet er i removeUser metode. Som standard, hvis jeg ikke binder sammenheng == dette UserToDelete - ikke viewModel objekt. Hvis jeg legger til konstruktøren: this.removeUser = this.removeUser.bind(this); (manually enforce context), deretter kontekst som trengte denne == viewmodel, men da Loggfila klager for Kan ikke konvertere funksjon til. (Bruker: Bruker) => tomrommet krever en samtale signaturer, men Funksjon mangler en

Publisert på 07/10/2012 klokken 08:04
kilden bruker
På andre språk...                            


5 svar

stemmer
5

Jeg er ikke kjent med ko så kanskje det er en bedre måte å løse sammenheng switching, men din Loggfila kompilatoren feilen skyldes 'bind' retur type 'Function' som er uforenlig med den type 'removeUser'. Du bør være i stand til å løse dette ved å kaste den tilbake funksjon i den opprinnelige typen signatur som følger:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Svarte 07/10/2012 kl. 17:33
kilden bruker

stemmer
2

Et alternativ er å endre klikk bindende å bruke Javascript er bind funksjon å tvinge verdien av thiså være ditt syn modell: data-bind="click: $root.MyFunc.bind($root)".

Legg merke til at $dataog klikk eventobjektet vil fortsatt være bestått som argumenter til MyFuncfra Knockout som beskrevet av klikk bindende spesifikasjonen. Hvis du trenger å overstyre argumentene som blir sendt til MyFunc, er det bare sende dem inn i bind funksjon etter $rootslik: .bind($root, param1, param2). Teknisk sett vil disse argumentene bli prepended til de argumentene som blir levert av Knockout, gi argumenter [param1, param2, data, event].

Svarte 15/04/2014 kl. 20:00
kilden bruker

stemmer
2

Vel jeg hadde det samme problemet dvs hvorfor jeg kom opp med følgende base klassen for å løse mitt problem

export class ViewModelBase {
    private prefix: string = 'On';

    public Initialize() {
        for (var methodName in this) {
            var fn = this[methodName];
            var newMethodName = methodName.substr(this.prefix.length);
            if (typeof fn === 'function' && methodName.indexOf(this.prefix) == 0 && this[newMethodName] == undefined) {
                this[newMethodName] = $.proxy(fn, this);
            }
        }
    }
}

Hva dette er sløyfe alle medlemmer av klassen, og hvis en metode starter med On vil det skape en ny metode uten På som vil kalle den opprinnelige metoden med riktig sammenheng.

Ikke at $.proxyer en jquery samtale slik at jquery er nødvendig for at dette skal fungere.

Svarte 05/11/2012 kl. 21:30
kilden bruker

stemmer
1

Jeg løp inn i det samme problemet. For å få den rette konteksten du kan bruke parameterne som er vedtatt av clickbinding. Den clickbinding passerer 2 parametere, dvs brukeren og jquery tilfelle av klikk.

Hvis du tar jquery arrangementet, og for å bruke ko.contextFor () -funksjonen, kan du få tak i riktig sammenheng.

Din funksjon vil se omtrent slik ut:

removeUser(user: User, clickEvent: any): void {
    var self = ko.contextFor(clickEvent.srcElement).$root;
    self.users.remove(user);
}
Svarte 01/02/2013 kl. 03:28
kilden bruker

stemmer
1

Vel, den enkleste løsningen og hva jeg vanligvis gjør med Loggfila og knockout js er at jeg ikke erklære funksjoner kalles fra knockout på prototypen, men i konstruktøren. Så, jeg ville gjøre det slik:

export class ViewModel {
        public users: knockout.koObservableArrayBase;
        removeUser:(user: User) => void;

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = (user:User) => {
                this.users.remove(user);
            }
        }
}
Svarte 08/12/2012 kl. 18:59
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more