2012-02-13 3 views
2

Я пытаюсь понять, что Knockout делает с элементами на странице, когда он обновляет значения в них из-за applyBinding.Нокаут - что срабатывает над элементом при изменении значения привязки?

Рассмотрим простой пример:

<!DOCTYPE html> 
<html> 
<head> 

    <title>Example</title> 
     <script src="../lib/jquery-1.7.1.min.js"></script> 
    <script src="../lib/knockout-2.0.0.js"></script> 

    <script> 
     $(function() { 
      $("#itemNumber").change(function() { 
       console.log('itemNumber'); 
      }); 

      //create The view Model 
      var product1 = { 
        id: 1002, 
        itemNumber: "T110", 
        model: "Taylor 110", 
        salePrice: 699.75 
       }; 
      ko.applyBindings(product1); 
     }); 
    </script> 
</head> 
<body > 
    <input data-bind="value: itemNumber" type="text" id="itemNumber" /> 
</body> 
</html> 

Когда я бегу страница T110 появится в моем поле ввода и, когда я изменить значение сообщения консоли отображается как я ожидал.

Но заметьте, это не срабатывает, когда applyBindings вызывается во время загрузки страницы, как я бы ожидать ...

Так что механизм не использует, чтобы изменить значение входного элемента? И то, что я действительно ищу, - это какой-то способ обнаружить это в самом элементе, так как это элемент управления, и я хотел бы скопировать реальное значение из скрытого поля в нужное место, но поддерживать любые значения, приложенные к нему ...

Благодаря

ответ

3

Вы можете видеть сами, прочитав source для значения связывания.

Событием по умолчанию для обработки изменений является событие , но это configurable.

Также, отличный способ узнать KnockoutJs - пройти через tutorials.

+0

Спасибо, Но его не делать то, что я ожидал еще. Почему это изменение не срабатывает в любое время после: ko.applyBindings (product1); называется? Тем не менее, как-то отображается значение ... Этот конкретный код, похоже, не вызван. – Tim

+0

Я действительно прошел через учебники. Но у меня есть случай для этой конкретной ситуации ... Я думаю, что нашел лучший способ сделать это, но это означает, что мой контроль должен зависеть от нокаута, который не всегда может быть так. – Tim

1

Он работает, если вы не используете событие изменения?

Попробуйте вручную подписываться, чтобы увидеть эффект, вместо этого:

product1.itemNumber.subscribe(function (newValue) { 
    console.log(newValue); 
}); 
+0

Спасибо, Но проблема i Я заинтересован в том, как определить, что ko меняет значение на объект. Поэтому, когда ko.applyBindings называется каким-то образом, мое значение обновляется. Как это сделать, если изменение не срабатывает. – Tim

+0

Вы видите, что оба обработчика прикреплены (console.log ($ ("# itemNumber"). Data ("events"). Change.length));)? Если нет, возможно, оберните свой код в блок $ (document) .ready() (я хватаю), так как ваш скрипт появляется перед телом. – Tuan