Typescript yanlış bağlam bu

oy
7

Kod:

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>

Sorun removeuser yönteminde olduğunu. ViewModel değil nesne - Varsayılan olarak, ben bağlamı bağlamak yoksa, bu UserToDelete ==. Ben kurucusuna eklenirse: this.removeUser = this.removeUser.bind(this); (manually enforce context)ardından bağlam bu == ViewModel tabi olarak, ama sonra typescript için şikayet için Fonksiyonu dönüştürülemez.: Void çağrı imzalarını gerektirir, ancak Fonksiyon birini yoksun => (kullanıcı Kullanıcı)

Oluştur 07/10/2012 saat 09:04
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
5

Ben belki orada bağlam geçişi çözmek için daha iyi bir yoldur, ama sizin typescript derleyici hatası 'removeuser' türü ile uyumsuz olan 'bağlama' türü döndüren 'Fonksiyonu' kaynaklanır ko aşina değilim. Sen şöyle orijinal tip imza içine döndü fonksiyonu atayarak bu çözmek mümkün olmalıdır:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
Cevap 07/10/2012 saat 18:33
kaynak kullanıcı

oy
2

Alternatif JavaScript'in kullanmak bağlama tıklayın değiştirmektir bağlamak değerini zorlamak için işlevini thisgörünümünüzü Model olmak: data-bind="click: $root.MyFunc.bind($root)".

Not $datave tıklama eventnesne halen argüman olarak geçilecek MyFunctarafından tarif edildiği gibi nakavt tıklama bağlama tarifnamede. Eğer geçirilen argümanları geçersiz kılmak için gerekiyorsa MyFunc, basitçe sonra bağlama işlevi içine geçmesi $rootgibi pek: .bind($root, param1, param2). Teknik olarak, bu argümanlar olacak verinin başına argümanları argümanlar vererek Knockout tarafından temin edilmektedir [param1, param2, data, event].

Cevap 15/04/2014 saat 21:00
kaynak kullanıcı

oy
2

Eh ben sorunumu çözmek için aşağıdaki temel sınıf ile geldi neden aynı sorun şu vardı

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

Ne yapar döngü sizin sınıfın tüm üyeler ve yöntem üzerinde başlar eğer doğru bağlamda orijinal yöntemini çağıracak On olmadan yeni bir yöntem oluşturur.

Değil o $.proxyjquery bu iş için gerekli böylece bir jquery çağrıdır.

Cevap 05/11/2012 saat 22:30
kaynak kullanıcı

oy
1

Eh, basit çözüm ve hangi normalde typescript ve nakavt js ile ilgisi ı prototipin nakavt gelen ancak yapıcı olarak adlandırılan fonksiyonları beyan kalmamasıdır. Yani, bu gibi yapacak:

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

        constructor () {
            this.users = ko.observableArray([]);
            this.removeUser = (user:User) => {
                this.users.remove(user);
            }
        }
}
Cevap 08/12/2012 saat 19:59
kaynak kullanıcı

oy
0

Ben de aynı problemle karşılaştım. doğru bağlamı almak için clickbinding tarafından geçirilen parametreler kullanabilirsiniz. clickbinding kullanıcı ve tıklama jquery olayı yani 2 parametreleri geçirir.

Eğer Jquery olayı almak ve ko.contextFor () işlevini kullanmak yerine, doğru bağlam elde edebilirsiniz.

İşleviniz gibi görünecektir:

removeUser(user: User, clickEvent: any): void {
    var self = ko.contextFor(clickEvent.srcElement).$root;
    self.users.remove(user);
}
Cevap 01/02/2013 saat 04:28
kaynak kullanıcı

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