2012-02-23 2 views
7

У меня есть якорь тег, как этотПередача параметров в функции в knockoutjs ViewModel

<a href="#" class="btn btn-success order-btn" data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier}, click: $root.setPath.bind($data,$data.tierName, $parent.identifier)">Send values</a> 

В ViewModel

var appViewModel = { 
    setPath: function (data, tier, identifier) { 
     alert(data); 
     alert(tier); 
     alert(identifier); 
    }, 
........... 
........... 
} 

В результате некоторые knockoutjs основной код, отображаемый в предупреждающем сообщении (возможно, определения наблюдаемые(), зависимые функции Observable() и [Объект объекта], который пуст при получении предупреждения с помощью JSON.stringify)

Почему это работает?

data-bind="attr:{'data-tiername':$data.tierName, 'data-identifier' : $parent.identifier} 

, но не это:

click: $root.setPath.bind($data,$data.tierName, $parent.identifier) 

отмечают, что tierName является наблюдаемой(), идентификатор вычисляется()

Где я могу найти больше о безвыходном() ??

ответ

6

Поскольку tierName и identifier являются наблюдаемыми, вам нужно вызвать их, чтобы получить доступ к их значениям:

click: $root.setPath.bind($data, $data.tierName(), $parent.identifier()) 

Кроме того, первый аргумент в bind() будет связан с this в setPath, так что я думаю, что вам нужно что-то вроде этого:

click: $root.setPath.bind(/*will be bound to this*/ $root, $data, 
         $data.tierName(), $parent.identifier()) 

Наконец, если $data само по себе является наблюдаемым (что не ясно, если это от вас код), то вам нужно вызвать его, а также:

click: $root.setPath.bind($root, $data(), $data().tierName(), $parent.identifier()) 

Также помните bind был введен в ECMAScript 5, поэтому он может отсутствовать во всех браузерах. Так что я бы, вероятно, сделать что-то вроде этого, вместо:

click: function(){$root.setPath($data, $data.tierName(), $parent.identifier());} 

Here дополнительная информация о связывают.

+0

Я хотел сделать 'alert (уровень); alert (идентификатор); 'в моей функции viewmodel, я действительно не хотел контекста (этого). Поэтому моя функция стала 'setPath (tier, identifier)' Спасибо за помощь – nthapa13

+0

KO добавляет реализацию 'bind', если она недоступна, поэтому, если вы ссылаетесь на KO, тогда вы можете использовать' bind'. –

+0

Спасибо, Р. Р. Нимейер, это хорошо знать. –

6

Первым параметром для bind является цель (вы хотите, чтобы this был), когда ваша функция выполнена. Итак, если вы хотите, чтобы data был первым аргументом, тогда это должен быть второй аргумент.

Внутри вашей функции, если вы имеете дело с наблюдаемыми или вычисленными наблюдаемыми, вам необходимо развернуть их, чтобы увидеть их значение. Вы бы сделали это, вызвав его как функцию alert(data()); или позвонив по номеру alert(ko.utils.unwrapObservable(data)); (который обычно используется, когда вы не знаете тип проекта, если то, с чем вы собираетесь иметь дело, является наблюдаемым или не наблюдаемым.

причина, по которой attr и другие переплеты работают, когда вы передаете наблюдаемую/вычисляется наблюдаемое в том, что они все вызов ko.utils.unwrapObservable для вас для удобства (так что вам не придется добавлять () при прохождении наблюдаемыми, если вы пишете выражение !$data().

Вот ссылка на связывание: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

+0

Благодарим вас за ответ, RRNN, это действительно полезно. – nthapa13

Смежные вопросы