2015-12-16 109 views
0

比方说,我有一个简单的指令,像这样:在重复循环或后循环期间更改属性?

app.directive('seo', function() { 
    return { 
     template: '<meta ng-repeat="tag in data" {{tag.attribute}}="{{tag.name}}" content="{{tag.content}}" />', 
     scope : { 
      data: '=' 
     }, 
     restrict: 'A', 
     replace:true 
    } 
}); 

因此,所有这样做是创建meta标签自动传递给它的一些数据:

HTML

<meta seo data="data" /> 

DATA

[{ 
    attribute : 'name', 
    content : 'foo', 
    name : 'image' 
}, 
{ 
    attribute : 'property', 
    content : 'bar', 
    name : 'title' 
}]; 

所以我们的目标是创建一个模板spi TS了这样的事情:

<meta class="ng-scope" ng-repeat="tag in data" name="image" content="foo" seo data="data"> 
<meta class="ng-scope" ng-repeat="tag in data" property="title" content="bar" seo data="data"> 

我如何可以动态地改变与Angularjs属性,显然这种方法我已使用{{tag.attribute}}作为特定属性之前等号不起作用。

+1

我认为最好的方法是使用两个指令。首先会执行ng-repeat并将标签对象传递给另一个。另一个将使用标签对象并在'link'函数中设置属性。我会尽快举出一个例子。 – scareddragon

回答

1

尝试双指令方法。

第一个(seo)将使用ng-repeat进行迭代,并且在每次迭代中都会将当前对象tag传递给第二个对象(seo-tag)。第二个将根据对象属性修改元素属性。

例子:

app.directive('seo', function() { 
    return { 
    template: '<meta ng-repeat="tag in data" seo-tag tag="tag" />', 
    scope : { 
     data: '=' 
    }, 
    restrict: 'A', 
    replace: true 
    } 
}); 

app.directive('seoTag', function() { 
    return { 
    scope : { 
     tag: '=' 
    }, 
    restrict: 'A', 
    replace: true, 
    link: function (scope, elem, attrs) { 
     attrs.$set(attrs.$normalize(scope.tag.attribute), scope.tag.content); 
    } 
    } 
}); 

此代码是不完美的,但我认为这是一个良好的基础。

This doc会有帮助。

编辑:

我甚至会跳过seo指令,只使用ng-repeatseo-tag。它太复杂,有两个级别,而且代码应该很简单:

<meta ng-repeat="tag in data" seo-tag tag="tag" /> 

in template。

+0

辉煌而优雅。谢谢堆! –

+1

我可能会添加一条建议,以便我们在seoTag指令中没有隔离范围?在链接函数中添加'var tag = scope。$ eval(attrs.seoTag);'并从该标签访问属性和内容。然后,将'tag'传递给另一个属性,将它传递给'seo-tag =“tag”'属性,你的想法是什么? –

+0

这就是为什么我写了“这个代码不完美,但我认为这是一个很好的基础。” :D – scareddragon