Angular JS - 文本框未在隔离范围中更新

时间:2016-05-10 10:15:36

标签: javascript angularjs

在我的JS文件中:

var app=angular.module("isolateScope",[]);

app.controller("attrScope",["$scope",function($scope){
    $scope.gem="ruby";    
}]);

app.directive("diffScope",function(){
   return{
       scope:{
           gemType:'@',
           twoWay:'=',
       },
       //template:'@scope:<input type="text" ng-model="gemType"/><br/><label>=Scope</label><input type="text" ng-model="twoWay"/>'
   } 
});

在我的HTML文件中:

 <div ng-controller="attrScope">
        <input type="text" ng-model="gem" />
        <div class="panel-group">
            <diff-scope gem-type="{{gem}}" two-way="gem">
                @scope:<input type="text" ng-model="gemType"/><br/><label>=Scope</label><input type="text" ng-model="twoWay"/>
                </diff-scope>
        </div>
    </div>

但是当输入父文本框时,子文本框没有更新,也没有使用父文本框中的值加载?

2 个答案:

答案 0 :(得分:1)

你不能像你一样在你使用你的指令的html中定义模板。在这种情况下,您必须使用transclusion,这样您就可以在指令的模板子元素中定义html内容。

定义指令时,必须指定templatetemplateUrl属性(就像您所做的那样,但将其注释掉)。即,在此模板中,您的范围属性将被传递并变为可用。

使用工作解决方案检查您的plunker的this叉。

答案 1 :(得分:1)

您可以在html中定义模板。 您必须使用> (define proc (+ 1 1)) > proc 2 > (proc) . . application: not a procedure; > (define (proc) (+ 1 1)) > proc #<procedure:proc> > (proc) 2 并将指令的隔离范围添加到链接中的transclusion中,并将具有隔离范围的transcludedElement添加到指令元素。

blog post中有一个非常好的描述。

请查看下面的演示或此fiddle

ng-transclude
var app = angular.module("isolatedScopeApp", []);

app.controller("attrScope", ["$scope",
  function($scope) {
    $scope.gem = "ruby";
  }
]);

app.directive("diffScope", function() {
  return {
    scope: {
      gemType: '@',
      twoWay: '=',
    },
    transclude: true,
    link: function(scope, element, attrs, ctrl, transclude) {
      transclude(scope, function(clone, scope) {
        element.append(clone);
      });
    }
  }
});