Javascript 指令中attr的角度保存观察表达式

Javascript 指令中attr的角度保存观察表达式,javascript,angularjs,Javascript,Angularjs,我想在指令中传递一些html到attr,问题是我没有保存绑定,只是显示初始值,我如何在这里完成数据绑定 function link( $scope, elem, attrs, ctrl, transclude ) { $scope.dropDownClass = attrs.ddClass || 'default'; var main = $compile(attrs.main)($scope); elem.find('button').first().append(ma

我想在指令中传递一些html到attr,问题是我没有保存绑定,只是显示初始值,我如何在这里完成数据绑定

function link( $scope, elem, attrs, ctrl, transclude ) {
    $scope.dropDownClass = attrs.ddClass || 'default';
    var main = $compile(attrs.main)($scope);
    elem.find('button').first().append(main);
  }

<my-drop-down main='<a><img src="images/flags/en.png" alt="en"/>{{name}}</a>'>
 <li><a><img src="images/flags/en.png" alt="en"/>En</a></li>
</my-drop-down>
功能链接($scope、elem、attrs、ctrl、transclude){
$scope.dropDownClass=attrs.ddClass | |'默认';
var main=$compile(attrs.main)($scope);
元素find('button').first().append(main);
}

好吧,我快速看了一眼。从我看到的情况来看,主属性是在
attr
查找之前进行评估的。因此,您实际上为标记编译了
,但这对我们没有帮助)。我认为有两种方法可以解决你的问题

选项#1:您可以从属性中拉出所需的模板字符串,并将其附加到
MainCtrl
中的范围中。看起来是这样的:


您还可以采取其他选择,如创建隔离作用域等,但它们需要对代码进行更多重构。上面两个似乎是最容易插入的。

问题是,在执行链接函数时,
name
已经被插入

除了@rgthree所说的之外,您还可以使用指令上的
compile
函数仅调用
var compiled=$compile(tAttrs.main)
,然后在链接函数中使用scope
var main=compiled($scope)
调用返回值:


选中此项

您能创建一个JSFIDLE吗?我有一些想法,但我脑子里还不清楚,我想。。好吧,处理好你的工作问题。谢谢你,伙计,我真的很感激你的回答,这很有帮助。
// Markup:
<my-drop-down> ...

// MainCtrl:
app.controller('MainCtrl', function($scope) {
  $scope.name = 'World';
  $scope.main = '<a>{{name}}</a>';
});

// Then, in your directive link:
function link($scope, elem, attrs, ctrl, transclude ) {
  $scope.dropDownClass = attrs.ddClass || 'default';
  // Use scope.main, instead of attrs.main:
  var main = $compile($scope.main)($scope);
  elem.find('button').first().append(main);
}
// Markup:
<my-drop-down main="<a>%%name%%</a>">

// Then, in your directive link:
function link($scope, elem, attrs, ctrl, transclude ) {
  $scope.dropDownClass = attrs.ddClass || 'default';
  // Replace our template string and compile that w/ braces:
  var tpl = attrs.main.replace(/%%([a-z]+)%%/g, '{{$1}}');
  var main = $compile(tpl)($scope);
  elem.find('button').first().append(main);
}
compile: function compile(tElement, tAttrs, transclude) {
      var compiled = $compile(tAttrs.main);
      return function( $scope, elem, attrs, ctrl, transclude ) {
          $scope.dropDownClass = attrs.ddClass || 'default';
          console.log(3);
          var main = compiled($scope);
          elem.find('button').first().append(main);
      }
    },