Γραφομηχανή λάθος πλαίσιο αυτό

ψήφοι
7

Κώδικας:

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>

Το πρόβλημα είναι στη μέθοδο removeUser. Από προεπιλογή, αν δεν δεσμεύουν το πλαίσιο, αυτό == UserToDelete - δεν viewModel αντικείμενο. Αν έχω την προσθήκη κατασκευαστή: this.removeUser = this.removeUser.bind(this); (manually enforce context), τότε το πλαίσιο είναι ανάλογα με τις ανάγκες αυτής της == viewmodel, αλλά στη συνέχεια γραφομηχανή παραπονιέται για «Δεν είναι δυνατή η μετατροπή Λειτουργία για να. (Χρήστη: Ο χρήστης) => κενό απαιτεί μια κλήση υπογραφές, αλλά η λειτουργία δεν έχει ένα»

Δημοσιεύθηκε 07/10/2012 στις 09:04
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
5

Δεν είμαι εξοικειωμένος με ko έτσι ίσως υπάρχει ένας καλύτερος τρόπος για να λυθεί το μεταγωγή πλαίσιο, αλλά το σφάλμα compiler γραφομηχανή σας προκαλείται από «δεσμεύουν» επιστροφή τύπου «Λειτουργία», το οποίο δεν είναι συμβατό με τον τύπο του «removeUser». Θα πρέπει να είναι σε θέση να λύσει αυτό με τη ρίψη της επέστρεψε λειτουργία στο αρχικό είδος υπογραφής ως εξής:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Απαντήθηκε 07/10/2012 στις 18:33
πηγή χρήστη

ψήφοι
2

Μια εναλλακτική λύση είναι να αλλάξετε τη σύνδεση για να χρησιμοποιήσετε την Javascript για κλικ δεσμεύουν λειτουργία για να αναγκάσει την αξία του thisνα είναι μοντέλο άποψή σας: data-bind="click: $root.MyFunc.bind($root)".

Σημειώστε ότι $dataκαι το κλικ eventαντικείμενο θα εξακολουθεί να περάσει σε όσο επιχειρήματα για να MyFuncαπό Knockout όπως περιγράφεται από τον δεσμευτικό κλικ προδιαγραφή. Αν χρειαστεί να παρακάμψετε τα επιχειρήματα που πέρασε MyFunc, απλά να περάσει τους στη λειτουργία δεσμεύουν μετά $root, όπως αυτό: .bind($root, param1, param2). Τεχνικά, τα επιχειρήματα αυτά θα πρέπει να προταχθεί τα επιχειρήματα που παρέχονται με νοκ-άουτ, δίνοντας επιχειρήματα [param1, param2, data, event].

Απαντήθηκε 15/04/2014 στις 21:00
πηγή χρήστη

ψήφοι
2

Λοιπόν είχα το ίδιο πρόβλημα thats γιατί ήρθα με την ακόλουθη βασική κλάση για να διορθώσετε το πρόβλημά μου

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

Αυτό που κάνει είναι βρόχου όλα τα μέλη της τάξης σας και αν μια μέθοδος ξεκινά με Σε αυτό θα δημιουργήσει μια νέα μέθοδο χωρίς Από που θα καλέσει την αρχική μέθοδο με το σωστό πλαίσιο.

Όχι ότι $.proxyείναι ένα κάλεσμα jQuery, ώστε jQuery είναι απαραίτητη για να δουλέψει αυτό.

Απαντήθηκε 05/11/2012 στις 22:30
πηγή χρήστη

ψήφοι
1

Λοιπόν, η πιο απλή λύση και τι κάνω συνήθως με γραφομηχανή και νοκ-άουτ js είναι ότι εγώ δεν δηλώνουν τις λειτουργίες που ονομάζεται από νοκ-άουτ για το πρωτότυπο, αλλά στο κατασκευαστή. Έτσι, θα ήθελα να το κάνω κάπως έτσι:

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

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = (user:User) => {
                this.users.remove(user);
            }
        }
}
Απαντήθηκε 08/12/2012 στις 19:59
πηγή χρήστη

ψήφοι
0

Έτρεξα στο ίδιο πρόβλημα. Για να πάρετε το σωστό πλαίσιο μπορείτε να χρησιμοποιήσετε τις παραμέτρους που έχουν περάσει από την clickbinding. Η clickbinding περνάει 2 παραμέτρους, δηλαδή του χρήστη και του γεγονότος jQuery του κλικ.

Αν πάρετε το γεγονός jQuery, και από ό, χρησιμοποιήστε τη λειτουργία ko.contextFor (), μπορείτε να αποκτήσετε το σωστό πλαίσιο.

Λειτουργία σας θα είναι κάπως έτσι:

removeUser(user: User, clickEvent: any): void {
    var self = ko.contextFor(clickEvent.srcElement).$root;
    self.users.remove(user);
}
Απαντήθηκε 01/02/2013 στις 04:28
πηγή χρήστη

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