2014-03-13 122 views
1

我有一個簡單的字符串如下:

var templateString = "<span>This is a test</span>" 

此字符串是一個指令的link函數中定義。

現在,link功能裏面,我執行以下代碼:

scope.$eval(templateString); 

我的下一步是$compile數據,並將其與範圍相關聯。

但是,我得到的錯誤,當我做$eval

Uncaught Error: Syntax Error: Token 'span' is an unexpected token at 
column 2 of the expression [<span>This is a test</span>] 
starting at [span>This is a Test</span>]. 

但是,如果我看位於here的文檔,我似乎已經進行了正確但該字符串不評估的步驟。

編輯:我使用的是下面的示例文件:

angular.module('compile', [], function($compileProvider) { 
    // configure new 'compile' directive by passing a directive 
    // factory function. The factory function injects the '$compile' 
    $compileProvider.directive('compile', function($compile) { 
     // directive factory creates a link function 
     return function(scope, element, attrs) { 
     scope.$watch(
      function(scope) { 
      // watch the 'compile' expression for changes 
      return scope.$eval(attrs.compile); 
      }, 
      function(value) { 
      // when the 'compile' expression changes 
      // assign it into the current DOM 
      element.html(value); 

      // compile the new DOM and link it to the current 
      // scope. 
      // NOTE: we only compile .childNodes so that 
      // we don't get into infinite loop compiling ourselves 
      $compile(element.contents())(scope); 
      } 
     ); 
     }; 
    }) 
    }); 

我沒有使用$watch然而,因爲我不需要看任何表情和我已經有了模板(templateString) 。

+0

該文檔似乎沒有提及'$ eval'的任何地方。您應該直接'編譯'模板併爲其提供創建'element'的範圍,除非您通過'attrs'元素獲取該字符串,否則您不需要任何'$ eval'。 –

+0

@musically_ut我更新了我的問題,以表明我正在使用的示例。如果我不評估,那麼在span標籤中的任何角度表達式都會被顯示,因爲它沒有先評估它。我希望角度表達式(如果有的話)在我編譯之前進行評估。 – callmekatootie

回答

4

$eval是要評估一個表達式,你的templateString不是一個有效的表達式,這就是錯誤發生的原因。

你應該只使用$compile(templateString)(scope),它會編譯你的模板,鏈接與範圍,意味着所有的表達式將被提供的範圍進行評估。

+0

如何將編譯好的模板添加到元素中?我的意思是,在執行'$ compile'後,我希望將編譯後的模板添加到DOM中的特定位置 - 我該怎麼做? – callmekatootie

+0

沒關係,我得到了關於添加編譯模板[這裏]的答案(http://stackoverflow.com/questions/14846836/insert-an-angular-js-template-string-inside-an-element)。感謝您的回答。 – callmekatootie