2014-01-29 85 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

相关问题