1

我有一个指令,它的属性包含一个范围名称,当指令中设置了某些内容时,我想更新它。

<div data-my-directive data-scope-var-to-update="my_scope_variable"></div>



.directive('myDirective', function($rootScope){
        return function(scope, element, attrs){

            var scope_var_name = attrs.scopeVarToUpdate;

            scope[scope_var_name] = 'This message was updated from the directive';
        }
    })

仅当范围变量不包含任何点符号时,以上内容才允许我做我想做的事。

我的问题是如何修改上述内容以适应包含点符号的范围变量,例如 $scope.ab?

<div data-my-directive data-scope-var-to-update="a.b"></div>

上面的想法是传入任何范围变量名称,并在指令完成后从指令中更新它,这意味着父控制器应该可以访问新的赋值。

4

2 回答 2

1

你用scope.$eval(attrs.scopeVarToUpdate)

.directive('myDirective', function(){
    return function(scope, element, attrs){
        scope.$eval(attrs.scopeVarToUpdate) = 'This message was updated from the directive';
    }
})

或者使用具有双向绑定的隔离范围,不用担心任何这些。隔离范围版本:

.directive('myDirective', function(){
    return{
      scope:{scopeVarToUpdate:'='},
      link: function(scope, element, attrs){
        scope.scopeVarToUpdate = 'This message was updated from the directive';
      }
    }
})
于 2013-09-25T15:54:41.860 回答
1

您需要将 $parse 服务用于点符号模型。你的指令中有这样的东西

var getter = $parse(parseattrs.scopeVarToUpdate);
var setter = getter.assign;
getter(scope);   //get value
setter(scope,'value'); //set value

请参阅此处的文档http://docs.angularjs.org/api/ng .$parse

于 2013-09-25T16:09:46.523 回答