Gépelt rossz környezetben ezt

szavazat
7

Kód:

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>

Probléma van RemoveUser módszer. Alapértelmezésben, ha nem kötődnek az összefüggésben ez == UserToDelete - nem viewModel objektumot. Ha hozzátéve, hogy kivitelező: this.removeUser = this.removeUser.bind(this); (manually enforce context), majd kontextus szükség ezen == viewmodel, de aztán géppel panaszkodik a „függvény nem konvertálható a (user: Felhasználó) => void igényel hívás aláírást, de funkció hiányzik egy.”

A kérdést 07/10/2012 09:04
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
5

Nem vagyok tisztában ko így talán van egy jobb módja annak, hogy megoldja a kontextus váltás, de a géppel fordító hibát okozott „kötődnek” visszatérő típus „funkció”, amely összeegyeztethetetlen a fajta „RemoveUser”. Meg kell tudni, hogy megoldja ezt a casting a visszaadott függvény az eredeti típus aláírás az alábbiak szerint:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Válaszolt 07/10/2012 18:33
a forrás felhasználó

szavazat
2

Egy másik lehetőség, hogy változtatni a kattintási kötő használni JavaScript kötődnek funkció kényszeríteni az értéke this, hogy a nézet modell: data-bind="click: $root.MyFunc.bind($root)".

Megjegyezzük, hogy $dataa kattintás eventobjektum továbbra is telt el érvként, hogy MyFunchonnan Knockout által leírt kattintással kötelező előírás. Ha meg kell, hogy felülbírálja az érvek kerülnek átadásra a MyFunc, egyszerűen át őket a bind funkció után $rootígy néz ki: .bind($root, param1, param2). Technikailag ilyen érvek fűzve az érvek által szállított Knockout, így érveket [param1, param2, data, event].

Válaszolt 15/04/2014 21:00
a forrás felhasználó

szavazat
2

Hát én ugyanaz volt a probléma amit miért jött a következő alap osztály oldani a kérdés

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);
            }
        }
    }
}

Mi ez hurok minden tagja az osztály, és ha egy eljárás indul On ez létre fog hozni egy új módszert nélkül Azon meg fogja hívni az eredeti módszer a megfelelő kontextusban.

Nem mintha $.proxyegy jquery hívást, így jquery szükséges, hogy ez működjön.

Válaszolt 05/11/2012 22:30
a forrás felhasználó

szavazat
1

Nos, a legegyszerűbb megoldás, és amit általában csinálni géppel és kiütéssel js, hogy én nem nyilvánítja funkciókat hívott kiütött a prototípus, de a kivitelező. Tehát, azt, hogy úgy, mint ez:

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

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = (user:User) => {
                this.users.remove(user);
            }
        }
}
Válaszolt 08/12/2012 19:59
a forrás felhasználó

szavazat
0

Futottam ugyanaz a probléma. Ahhoz, hogy a megfelelő kontextusban akkor a paramétereket, amelyeket át a clickbinding. A clickbinding halad 2 paraméter, azaz a felhasználó és a jquery esetén a kattintás.

Ha megteszi a jquery eseményt, mint használja a ko.contextFor () függvény, akkor megkapjuk a megfelelő kontextusban.

A funkció a következőképpen néz ki:

removeUser(user: User, clickEvent: any): void {
    var self = ko.contextFor(clickEvent.srcElement).$root;
    self.users.remove(user);
}
Válaszolt 01/02/2013 04:28
a forrás felhasználó

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