2014-10-17 114 views
0

我正在为某些添加的功能创建自定义输入指令。角度指令双向绑定问题

app.directive('myTextInput', [ 
    function() { 
     var directive = {}; 
     directive.restrict = 'A'; 
     directive.scope = { 
      textModel: '=' 
     }; 
     directive.link = function ($scope, element, attrs) { 
      // FUnctionality 
     }; 
     directive.template = '<input ng-model="textModel" type="text">'; 
    return directive; 
}]); 

和所用的分离的范围属性textModel为双向绑定。 和父范围HTML是:

<div my-text-input text-model="myScopeVariable"></div> 
<span>TYPED : {{myScopeVariable}}</span> 

控制器范围具有定义的变量$scope.myScopeVariable="";

当我这样做。 在指令输入中输入的内容可以在<span>标签中打印。 这告诉它正在更新。

问题是。

在父范围内。我有一个方法,将执行按钮单击。

$scope.doSomething = function(){ 
    console.log($scope.myScopeVariable); 
}; 

点击按钮。日志是空的。这应该是指令输入中输入的内容。

这就奇怪了

现在,如果定义范围变量

$scope.myScopeVariable = {key:''}; 

和在HTML中使用如

<div my-text-input text-model="myScopeVariable.key"></div> 
<span>TYPED : {{myScopeVariable.key}}</span> 

然后它工作的每一个地方。即使在以前说的功能doSomething()

任何想法发生了什么?

+0

Hrmm,我试着重现这个问题,但对我来说看起来很好。 http://plnkr.co/edit/SyRPmIvxvnAw7CPBv2NJ?p=preview – CozyAzure 2014-10-18 06:42:17

回答

0

这是因为myScopeVariable包含的值为字符串
所以,如果你改变从指令的文本框的值。它不会被反映。

而在第二种方法中,您指的是对象。所以每当你改变对象的值时,就调用它的相关的监视方法。价值将被更新。

0

my-text-input是一个指令,所以他有自己的范围,所以模型myScopeVariable不是由父母监视。

尝试这样的:

<div my-text-input text-model="$parent.myScopeVariable"></div> <span>TYPED : {{myScopeVariable}}</span>

这是不是最好的做法,但它可能工作。