Letra de imprenta contexto equivocado esta

votos
7

Código:

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>

El problema es que en el método removeuser. Por defecto, si no se unen contexto, el presente == UserToDelete - objeto no viewmodel. Si la adición de constructor: this.removeUser = this.removeUser.bind(this); (manually enforce context)y, a continuación contexto es necesario que este modelo de vista ==, pero luego se queja de mecanografiado No se puede convertir a la función (usuario: Usuario) => vacío requiere una llamada Firmas, pero la función carece de uno.

Publicado el 07/10/2012 a las 09:04
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
5

No estoy familiarizado con ko así que tal vez hay una mejor manera de resolver el cambio de contexto, pero el error del compilador manuscrito es causado por 'bind' volver tipo 'Función', que es incompatible con el tipo de 'removeuser'. Usted debe ser capaz de resolver esto mediante la fundición de la función devuelta a la firma de tipo original, de la siguiente manera:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Respondida el 07/10/2012 a las 18:33
fuente por usuario

votos
2

Una alternativa es cambiar la unión de utilizar JavaScript clic unen función para forzar el valor de thisser su modelo de vista: data-bind="click: $root.MyFunc.bind($root)".

Tenga en cuenta que $datay el clic eventobjeto todavía se pasa como argumento a MyFuncpartir del golpe de gracia como se describe por la unión clic especificación. Si necesita anular los argumentos que se pasan a MyFunc, simplemente pasarlos a la función se unen después de $rooteste modo: .bind($root, param1, param2). Técnicamente, estos argumentos se anteponen a los argumentos que se suministra por nocaut, dando argumentos [param1, param2, data, event].

Respondida el 15/04/2014 a las 21:00
fuente por usuario

votos
2

Bueno, yo tenía el mismo problema es por eso que ocurrió la siguiente clase base para arreglar mi problema

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

lo que esto hace es bucle de todos los miembros de su clase y si un método comienza con On creará un nuevo método sin En que llamará al método original con el contexto adecuado.

No es que $.proxyes una llamada jQuery jQuery por lo que se necesita para que esto funcione.

Respondida el 05/11/2012 a las 22:30
fuente por usuario

votos
1

Bueno, la solución más sencilla y lo que hago normalmente con el texto mecanografiado y JS nocaut es que no declaro funciones llamadas de nocaut en el prototipo, pero al constructor. Por lo tanto, yo lo haría así:

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

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = (user:User) => {
                this.users.remove(user);
            }
        }
}
Respondida el 08/12/2012 a las 19:59
fuente por usuario

votos
0

Tuve el mismo problema. Para obtener el contexto adecuado se pueden utilizar los parámetros que se pasan por el clickbinding. El clickbinding pasa 2 parámetros, es decir, el usuario y el evento jquery del clic.

Si se toma el caso de jQuery, y que utiliza la función ko.contextFor (), se puede obtener el contexto adecuado.

Su función sería algo como:

removeUser(user: User, clickEvent: any): void {
    var self = ko.contextFor(clickEvent.srcElement).$root;
    self.users.remove(user);
}
Respondida el 01/02/2013 a las 04:28
fuente por usuario

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