3

考虑一下这个小提琴:小提琴 1当您选择一个日期时,您会注意到它上面的文本没有更新。这是因为我必须在列表中使用一个对象,例如:Fiddle 2(简化版)。

但是,另一方面,这确实有效,没有点:Fiddle 3

有人可以解释fiddle 1和fiddle 3有什么区别吗?我读过关于原型继承(unerstanding scopes),但我不理解这种行为。

小提琴3:

HTML:

<div ng-controller="MyCtrl">
  Hello, {{name}}!


  <button ng-click="visible = !visible">Toggle</button>

  <div ng-show="visible">
    Some content 
    <sample visible="visible"></sample>
  </div>
</div>

Javascript:

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.name = 'Superhero';
    $scope.visible = true;
}

myApp.directive("sample", function(){
    return {
        restrict: 'E',
        template: '<span ng-click="hide()" style="cursor: pointer;">X</span>',
        scope:{
            visible: '='
        },
        link: function(scope, element, attributes){
            scope.hide = function(){
                console.log(scope.visible);
                scope.visible = false;
            }
        }
    }
});
4

2 回答 2

3

如果您的指令创建了一个隔离范围(并且没有中间范围),并且它=用于双向数据绑定,那么您不需要使用对象属性 - 即,您不需要一个“点”来获取它工作。

在 Fiddle 1 和 2 中,ng-repeat 正在创建一个中间(子)范围,该范围在原型上继承自 MyCtrl 范围。在这种情况下,您需要使用对象属性。

于 2013-08-02T22:14:58.010 回答
0

Fiddle3是有道理的,因为它试图隐藏自己并且所有变量都在它自己的隔离范围内。

Fiddle1如果您想实现诸如单击 X 时触发Toggle按钮隐藏sample控件之类的功能,它将更具可比性。因为Fiddle1您实际上想弄清楚如何在隔离范围之外修改值,而不是在指令创建的范围内。

于 2013-08-02T20:06:41.377 回答