Angularjs指令和范围(获取字符串而不是obj)

时间:2014-12-17 20:17:18

标签: angularjs

大家好我的指令有问题,我在论坛搜索任何解决方案,但我没有找到对我有益的事。

我有一个指令,在我的html里面一个ng-repeat,看起来像这样

<custom-slide item="{{slides[$index]}}" pos='$index'  ></custom-slide>

我需要以这种方式传递项目,因为我需要观察在主控制器中是否更改了此对象的值。

我的指令范围是这样的:

 return {
restrict: 'E',
link: linker,
scope:{
    item: '@item',
    pos: '=pos'
    //slide: '@slide',

}

我的问题是,当我使用scope.item我得到的是一个字符串,而不是一个objetc。

{type:0, isSelected:'slide' ,param1:'',param2:' ',param3:' '}

但是我把它作为字符串,它可以将它作为一个对象,而不需要解析

任何建议!!?非常感谢你!

修改

我需要将item作为对象,因为在我的链接器中我更改了指令的模板,并且在此模板中我有类似的东西:

   <div>
   <div class="mainText">{{scope.item.param1}}</div>
   <div class="footer Text">{{scope.item.param2}}</div>
   </div>

所以当评估{{scope.item.param1 }}时,该值是未定义的,因为它不是一个对象

3 个答案:

答案 0 :(得分:0)

尝试从项目attr:

中删除{{}}
<custom-slide item="slides[$index]" pos="$index"></custom-slide>

答案 1 :(得分:0)

如果您尝试绑定表达式,则应使用=

 return {
restrict: 'E',
link: linker,
scope:{
    item: '=',
    pos: '=pos'
    //slide: '@slide',

}

然后在没有大括号的属性中传递表达式:

<custom-slide item="slides[$index]" pos="$index" ></custom-slide>

答案 2 :(得分:0)

你得到一个字符串,因为你真的将JSON放在DOM中,这是一个非常糟糕的主意,并且无法通过引用来修改。

基本上你不能将JSON作为属性传递,实际上没有理由。这是你的指令的一个版本,它只传递你如何从范围获取数据,并使用$ parse实际获取该数据。

HTML

<custom-slide item="slides[$index]}.item}" pos='$index'  ></custom-slide>

指令

module.directive('customSlide', function($parse) {
    return {
        restrict: 'E',
        link: function(scope, element, attrs) {
            var pos = attrs.pos;
            var item = $parse(attrs.item)(scope);
        }
    }
});