Как написать в ko.observable о событии?

Я использую нокаут для привязки и работаю над модулем общего доступа. в основном, есть пара ссылок, и все они в основном вызывают одну и ту же функцию только с разными значениями. Например, когда вы нажимаете на Facebook, тогда все службы со значением «Facebook», а когда и когда вы нажимаете на Twitter, вызывают функцию со значением «Twitter». Но в основном вызывает ту же функцию. Теперь, когда нет способа указать параметры из HTML, потому что все, что я могу сделать, это что-то вроде data-bind="click: Share". Здесь мы можем видеть, что я не могу указать здесь какие-либо параметры.

Теперь я могу создать ko.observable в моем файле js, который эта функция будет принимать в качестве аргумента... но мне нужен способ написать об этом наблюдаемом событии щелчка html при нажатии разных ссылок. Любая идея о том, как это сделать?


person Lost    schedule 20.06.2012    source источник
comment
Это очень трудно понять. Пожалуйста, отредактируйте свой вопрос для ясности (или, возможно, добавьте код), если мой ответ не распространяется на ваш вопрос.   -  person Kyeotic    schedule 20.06.2012


Ответы (1)


Knockout передает текущий контекст любой функции, используемой в привязке данных. Это означает, что если вы вызовете click: share, он будет передан в службу, которую вы связали. Вот скрипт, демонстрирующий это, но я приведу здесь код, так как он довольно прост .

Для более сложных привязок ваш объект, вероятно, будет иметь свойство name, которое вы можете использовать вместо $data, а также использовать в своей функции share().

HTML:

<ul data-bind="foreach: services">
    <li data-bind="text: $data, click: $parent.share" />
</ul>​

Javascript:

data = [
"Facebook",
"Twitter",
"Flickr",
"SomeOtherWeb2.0 Service"
];

var ViewModel = function(data) {
    this.services = ko.observableArray(data);
    this.share = function(service){
        alert("You Clicked on: " + service);
    };

};

ko.applyBindings(new ViewModel(data));​
person Kyeotic    schedule 20.06.2012
comment
Я точно вижу вашу точку зрения. Так что в основном я должен дать контекст всем моим ссылкам, и в вашем примере data[] становится этим контекстом. Итак, думаю, мое решение заключается в использовании массива данных. Я использую все разные ссылки, и они не имеют никакого отношения друг к другу, в то время как в вашем случае вы создаете их с использованием шаблонов и убедитесь, что все они взяты из одного и того же источника, и вы можете связать их. Спасибо. - person Lost; 21.06.2012
comment
@Californicated, массив данных был примером, который можно использовать вместо источника данных для вашего приложения. И в контексте click элемент в массиве является контекстом, а не всем массивом data. Есть способы реализовать эту функциональность, не связывая ссылки вместе, но я бы избегал их. Knockout пытается удержать вас в шаблоне MVVM, и его использование облегчит вашу жизнь в будущем. - person Kyeotic; 21.06.2012