2012-06-26 2 views
2

У меня есть проект, где я не могу понять, как получить доступ к наблюдаемому массиву из события click, вызванного из шаблона контейнера. У меня есть урезанный пример в скрипке здесь:Как я могу получить доступ к наблюдаемому массиву в моем клик-событии?

http://jsfiddle.net/zBarW/26/

Событие щелчка указано в шаблоне, который динамически загружает шаблон для каждого элемента из свойства на самом изделии.

Так пример деталь:

{ID: 1, TemplateName: 'template1', Label: 'Name', Description: 'Your name'} 

"родительский" шаблон выглядит следующим образом:

<script type="text/html" id="tpl-placeholder"> 
<div class="entry" data-bind="click: $parent.RemoveEntry, attr: { id: ID}, template: {name: TemplateName }"></div> 
</script> 

И динамически загруженный шаблон выглядит следующим образом:

<script type="text/html" id="template1"> 
    <h1 data-bind="text: Label"></h1> 
    <div data-bind="text: Description"></div> 
</script> 

В метод, который обрабатывает событие click - в этом случае RemoveEntry - я получаю null при попытке доступа к общему ervableArray (Записи).

Вот ViewModel:

var viewModel = { 

    Name: ko.observable("Entries"), 

    Entries: ko.observableArray(entries), 

    RemoveEntry: function (entry) { 
     // how do I access the "Entries" list here - this.Entries returns null 
     $("#debug").text(this.Entries == null); 
     this.Entries.remove(entry); 
    } 
}; 

Я Нокаут Newb .. может кто-нибудь сказать мне, что я делаю неправильно здесь? Спасибо!

ответ

2

, как вы есть, вы прямой доступ viewmodel.Entries ...

однако, более типично вы могли бы сделать это нравится: -

http://jsfiddle.net/keith_nicholas/RAMcc/

с хорошим оле Javascript хак

var self = this; 
+0

Привет Кит, похоже, что я ответил на мой собственный вопрос, и в то же время вы отправили это. Вы заметили, что ваша скрипка не работает? Шаблоны не загружаются. – obliojoe

+0

Да, я только что заметил, как вы это делаете, а это не так, как обычно люди рассматривают модели, поэтому я просто добавил скрипку с тем, что обычно делается –

+0

Да, спасибо Кит. Это имеет смысл. Ура! – obliojoe

0

В моем первоначальном испытании, я обнаружил, что я мог бы использовать viewModel.Entries. Я думаю, что ответ Кейта лучше, это, безусловно, более типичный метод. Я оставлю это здесь для полноты.

В моем примере, это работает:

RemoveEntry: function (entry) { 
    // how do I access the "Entries" list here - this.Entries returns null 
    $("#debug").text(viewModel.Entries == null); 
    viewModel.Entries.remove(entry); 
} 
Смежные вопросы