2012-10-11 55 views
3

我正在處理的項目需要很多有關複雜XML文件的工作,因此我將它們轉換爲SimpleXML數組,JSON將其編碼並通過Ajax將其傳遞給Knockout。KnockoutJS:綁定到具有非法名稱的對象

問題是,幾乎每個屬性都有屬性,SimpleXML插入一個名爲@attributes的對象中。當我嘗試綁定到它像myObject()[email protected],我得到一個錯誤

Message: SyntaxError: Unexpected token ILLEGAL; 
Bindings value: text: alertObj()[email protected] 

我已經試過'@attributes', ['@attributes'], [@attributes]但沒有什麼工作。我也嘗試過各種轉義字符和unicode轉義。

這是JSON的樣子:

 var alertObject = 
      { 
       "@attributes": 
        { 
         "DescriptionContentType":"text\/plain", 
         "Description":"", 
         "IsActive":"true", 
         "Name":"Apache Requests Per Interval" 
        }, 
       "Frequency": 
        { 
         "PeriodInSeconds":"60" 
        }, 
       "MetricLevelNotification":"false", 
       "AlertTriggerMode":"2", 
       "CautionActionDelay":"0", 
       "DangerActionDelay":"0", 
       "CautionActionList": 
        { 
         "ActionID": 
          { 
           "ManagementModuleName":"Base Module", 
           "ConstructName":"Base SMTP Mail Action" 
          } 
        }, 
       "DangerActionList": 
        { 
         "ActionID": 
          { 
           "ManagementModuleName":"Base Module", 
           "ConstructName":"Base SMTP Mail Action" 
          } 
        }, 
       "MetricGroupingID": 
        { 
         "ManagementModuleName":"Base Module", 
         "ConstructName":"Apache Requests Per Interval" 
        }, 
       "AlertCombineOperator":"1", 
       "AlertCompareOperator":"2", 
       "CautionTargetValue":"2000", 
       "DangerTargetValue":"15000", 
       "CautionMinNumPerPeriod":"3", 
       "CautionAlertPeriod":"6", 
       "DangerMinNumPerPeriod":"1", 
       "DangerAlertPeriod":"1" 
      }; 

我想避免改變任何結構和名稱。

我怎樣才能得到這個工作?

回答

5

那是因爲它不是一個有效的JavaScript變量名:

標識符必須以$,_,或以Unicode 類別「大寫字母(陸)」任何字符,「小寫字母(Ll)「, 」Titlecase letter(Lt)「,」Modifier letter(Lm)「,」Other letter(Lo)「, 或」Letter number(N-1)「。

http://mathiasbynens.be/notes/javascript-identifiers

變量名稱不能以@開頭,因此你看到的錯誤。添加單引號,括號或其他任何內容都沒有意義。變量名稱無效,您需要更改從服務器返回數據的方式。

+0

這很有道理。在json編寫它之前,我將在服務器端修改數組。謝謝。 – solefald

1

我遇到了類似的問題,我完全同意你應該改變數據從服務器返回的方式。但是,如果您確實無法控制數據或暫時無法控制數據,則可能會呈現您想要使用的內容:

$data['@attributes'].Name 
相關問題