2013-08-20 22 views
3

在我的Windows 8 WinJS應用程序,我有一個視圖填充viewModel。 ViewModel包含observable屬性(通過WinJS.Binding.as),它綁定到我的HTML視圖中的文本輸入。當我從viewModel中更改此屬性的值時,文本輸入的值將發生更改,但是不會觸發此文本輸入的「onchange」事件。WinJS通知綁定時執行

有沒有辦法知道綁定執行的確切時刻?爲什麼「onchange」事件沒有解僱?我想對視圖代碼背後的viewModel進行的視圖更改做出反應。

回答

2

問題看起來不是很清楚。其中一些細節可能會對您有所幫助。

  1. WinJS不支持雙向綁定。僅支持從視圖模型到視圖的綁定。其他方式 - 查看模型 - 不支持。您需要在輸入元素上顯式監聽「更改」事件並對其進行處理。
  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. 要聆聽input元素的變化,您可以偵聽'change'事件。

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

我實現了我自己的雙向綁定 - 我能夠對viewModel中的更改作出反應,反之亦然。我的問題是 - 我如何應對視圖代碼背後的viewModel所做的更改?例如,我有我的視圖中的文本輸入綁定到viewModel的屬性。當我在viewModel中更改屬性時,文本輸入的值在視圖中發生變化 - 我想在視圖的代碼後面聽文本輸入的更改。 –

+0

好的,經過一些測試,點2)中提到的解決方案是一種方法。我在後面的代碼中做了類似的事情:viewModels.myViewModel.bind(「myProperty」,myHandler)。非常感謝你! –

0

您不能使用「更改」事件,因爲只有當輸入失去焦點並且值發生更改時纔會觸發它。您不能使用「輸入」事件,因爲它在「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"; 
    } 
}) 

檢查propertyName是很重要的,否則事件將在循環中被觸發。

+0

不幸的是,的attachEvent方法不存在(因爲我是貶值在網絡上閱讀),並正如你所提到的addEventListener()不工作。我正在使用WinJS 2.0(Windows 8.1目標) - 也許這就是爲什麼attachEvent方法不再存在的原因。 –

+1

是的,WinJS 2.0使用IE11的JS引擎,顯然我提供的解決方案非常慢,所以他們放棄了它。他們正在用突變觀察員取代「財產變更」。看到這篇文章:http://msdn.microsoft.com/en-us/library/ie/dn265032(v=vs.85).aspx 是的,由Sushil解決方案來監聽對象的變化要好得多。 –