टाइपप्रति गलत संदर्भ इस

वोट
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);
        }
}

एचटीएमएल:

<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 विधि में है। ViewModel नहीं वस्तु - डिफ़ॉल्ट रूप से, अगर मैं संदर्भ के लिए बाध्य नहीं है, इस UserToDelete ==। अगर मैं निर्माता को जोड़ने: this.removeUser = this.removeUser.bind(this); (manually enforce context), तो संदर्भ इस == viewmodel की जरूरत है के रूप में है, लेकिन फिर टाइपप्रति के लिए शिकायत करने के लिए समारोह कनवर्ट नहीं कर सकता। (उपयोगकर्ता: उपयोगकर्ता) => शून्य एक कॉल हस्ताक्षर आवश्यकता है, लेकिन समारोह एक का अभाव

07/10/2012 को 09:04
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
5

मैं ko से परिचित नहीं हूँ तो शायद वहाँ संदर्भ स्विचिंग हल करने के लिए एक बेहतर तरीका है, लेकिन अपने टाइपप्रति संकलक त्रुटि 'बाँध' प्रकार लौटने 'समारोह' जो 'removeUser' के प्रकार के साथ संगत नहीं है के कारण होता है। आप मूल प्रकार हस्ताक्षर में लौटे समारोह कास्टिंग इस प्रकार से इस को हल करने के लिए सक्षम होना चाहिए:

this.removeUser = <(user: User) => void> this.removeUser.bind(this);
07/10/2012 को 18:33
का स्रोत उपयोगकर्ता

वोट
2

एक वैकल्पिक क्लिक जावास्क्रिप्ट का उपयोग करने के लिए बाध्यकारी बदलने के लिए है बाँध फंक्शन का मान मजबूर करने के लिए thisअपने दृष्टिकोण को मॉडल के लिए: data-bind="click: $root.MyFunc.bind($root)"

ध्यान दें कि $dataऔर क्लिक eventवस्तु अभी भी में तर्क के रूप में पारित हो जाएगा MyFuncनॉकआउट से के रूप में द्वारा वर्णित क्लिक बाध्यकारी विनिर्देश। आप तर्क करने के लिए पारित किया जा रहा ओवरराइड करने के लिए की जरूरत है MyFunc, बस के बाद बाँध समारोह में उन्हें पारित $rootकी तरह तो: .bind($root, param1, param2)। तकनीकी तौर पर, इन तर्कों की जाएगी prepended तर्कों को नॉकआउट द्वारा आपूर्ति की जा रही, तर्क दे रही है [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