2013-08-20 2 views
3

В моем приложении Windows 8 WinJS у меня есть вид, заполненный viewModel. ViewModel содержит наблюдаемое свойство (через WinJS.Binding.as), которое привязано к текстовому вводу в моем HTML-представлении. Когда я изменяю значение этого свойства из моей модели viewModel, изменяется значение ввода текста, однако событие «onchange» для этого ввода текста не запускается.Уведомление WinJS при выполнении связывания

Есть ли способ узнать точный момент, когда было выполнено переплет? Почему событие «onchange» не запускается? Я хотел бы отреагировать на изменения в представлении, сделанные из кода viewModel.

ответ

2

Вопрос выглядел не очень ясно. некоторые из этих деталей могут вам помочь.

  1. WinJS не поддерживает двустороннюю привязку. Поддерживается только привязка с viewmodel для просмотра. другой путь - просмотр для просмотра модели - не поддерживается. вам нужно будет явно прослушать событие «change» на элементе ввода и обработать его.
  2. Если вы ищете событие, когда изменяется наблюдаемое свойство, вы можете использовать bind method.

    var p = { name: 'martin' }; 
    var o = WinJS.Binding.as(p); 
    o.bind('name', function onnamechange(newValue, oldValue) 
    { 
        console.log('property changed: ', oldValue, newValue); 
    }); 
    o.name = 'mark'; 
    
  3. Для прослушивания изменений входного элемента, вы можете слушать «изменения» события.

    inputElement.addEventListener('change', function(evt) 
    { 
        // your code here. 
    }); 
    
+0

Я реализовал свою собственную привязку twoway - я могу реагировать на изменения в viewModel in view и наоборот. Мой вопрос: как я могу реагировать на изменения, сделанные для просмотра кода в коде зрения? E. g. У меня есть текстовый ввод в моем представлении, который привязан к свойству viewModel. Когда я изменяю свойство в viewModel, изменяется значение ввода текста - я хотел бы прослушать изменение текстового ввода в коде вида. –

+0

Хорошо, после некоторого тестирования решение, упомянутое в пункте 2), - это путь. Я сделал что-то подобное в коде моего взгляда: viewModels.myViewModel.bind («myProperty», myHandler). Большое спасибо! –

0

Вы не можете использовать событие «change», так как оно запускается только тогда, когда вход теряет фокус и значение изменяется. Вы не можете использовать событие «вход», потому что оно срабатывает при «keydown». Проверьте документацию для этих двух событий:

Изменение: http://msdn.microsoft.com/en-us/library/windows/apps/hh441307.aspx

Вход: http://msdn.microsoft.com/en-us/library/windows/apps/jj569354.aspx

То, что вы можете использовать это "onpropertychange" событие. Я попробовал, и по какой-то причине он не работает с addEventListener(), но работает с attachEvent().

inpt.attachEvent("onpropertychange", function (e) { 
    if (e.propertyName == "value") { 
     inpt.style.background = "red"; 
    } 
}) 

Важно проверить свойствоName, поскольку в противном случае событие будет запущено в цикле.

+0

К сожалению, метод attachEvent не существует (как я прочитал в Интернете, он обесценился) и, как вы упомянули addEventListener() не работает. Я использую WinJS 2.0 (цель для Windows 8.1) - возможно, поэтому метод attachEvent больше не существует. –

+1

Да, WinJS 2.0 использует JS-движок IE11, и, по-видимому, решение, которое я предоставил, очень медленное, поэтому они его сбросили. Они заменяют «propertychange» Наблюдателями Мутаций. См. Эту статью: http://msdn.microsoft.com/en-us/library/ie/dn265032(v=vs.85).aspx И да, решение Sushil для прослушивания изменений объекта намного лучше. –

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