2014-01-29 80 views
0

我正在使用一個指令,它只是freebase搜索小部件(jquery)的一個包裝。這是我嘗試製作的第一個指令,我遇到了一些問題。在Angularjs指令中傳遞屬性

期望的功能: 1.在語言(二字母代碼)以供顯示的搜索結果通過作爲屬性指定一個函數 2.能力的能力時,選擇的項目(通過從選擇數據傳遞)

被稱爲

我設置了a plunkr with the directive here。第二個功能工作得很好,但我遇到了語言要求的麻煩,我不知道爲什麼。

在語言代碼靜態傳遞時做它工作正常(不插值):

if(attrs.lang){ 
    language = attrs.lang; 
} 

但我似乎無法得到它試圖在這樣的值傳遞時工作:

attrs.$observe('lang', function(value) { 
     if(value === ""){ 
      language = 'en'; 
     } else { 
      console.log("lang val " + value); 
      language = value; 
     } 
}); 

任何想法,爲什麼這不工作?任何意見,將不勝感激。

的指令,因爲它主張:

directive('suggest', function($http) { 
    var language; 
    return { 
     restrict: 'E', 
     template: "<input type='text'>", 
     replace:true, 
     scope:{ 
      selectData:'=', 
      onSelect:'&' 
     }, 
     link: function(scope, element, attrs) { 

      attrs.$observe('lang', function(value) { 
       if(value === ""){ 
        language = 'en'; 
       } else { 
        console.log("lang val " + value); 
        language = value; 
       } 
      }); 

      if(attrs.lang){ 
       language = attrs.lang; 
      } 


      $(element).suggest({ 

       "lang": language 
      }) 
      .bind("fb-select", function(e, info) { 
       console.log(info); 
       scope.onSelect({data:info}); 
       console.log("language: " + language); 
       scope.$apply(function(){ 
        console.log("hello apply here"); 
        scope.selectData = info; 
       }); 
      }); 
     } 
    }; 
}); 

回答

1

它不是從你的問題不清楚,但是我想你指的是以下問題:當plunker演示中,我輸入「FR」的語言,然後進入東西建議使用box來獲得'en'語言的結果。

這是因爲您已經使用默認語言(en)初始化了插件。提供給$observe函數的函數在這裏沒有被調用 - 在你的指令被初始化之後它將在稍後被調用。所以當語言改變時,你需要重新初始化提示插件。

我不知道是什麼做的,由於我不熟悉的插件正確的方式,但至少有以下變化工作 - 只是增加了重新初始化到$observe聽衆:

attrs.$observe('lang', function(value) { 
     console.log("lang val " + value); 
     language = value; 
     $(element).suggest({lang: language}); 
    }); 
+0

這是完美的。非常感謝您的幫助GRaAL。我並沒有將提示代碼識別爲初始化,並且認爲它每次都運行。非常感激! :) – bornytm

+0

不,對於具有該指令的每個元素,都會調用一次'link'方法。使用事件監聽器,'$ observe'或'$ watch'來對事件或變化做出反應。 – GRaAL

相關問題