Angularjs 是否未设置指令默认范围值?

Angularjs 是否未设置指令默认范围值?,angularjs,angularjs-directive,Angularjs,Angularjs Directive,我想像这样在指令中设置默认值,但它将为null (function(angular) { 'use strict'; angular.module('docsTransclusionExample', []) .controller('Controller', ['$scope', function($scope) { }]) .directive('myDialog', function() { return { restrict: 'E',

我想像这样在指令中设置默认值,但它将为null

(function(angular) {
  'use strict';
angular.module('docsTransclusionExample', [])
  .controller('Controller', ['$scope', function($scope) {

  }])
  .directive('myDialog', function() {
    return {
      restrict: 'E',
      transclude: true,
      scope: {
        name: '=?'
      },
      templateUrl: 'my-dialog.html',
      link: function (scope, element) {

      },
      controller: function($scope) {
          $scope.name = 'Tobias';
      }
    };
  });
})(window.angular);
检查演示:

因为在调用该指令时,不会传入binding属性

名称
绑定到指令:

<my-dialog name="name">Check out the contents, {{name}}!</my-dialog>
检查内容,{{name}!
因为您使用的是
transclude:true
。Angular将为(
transclude scope
)转包内容创建一个单独的范围,即,
签出内容,{{name}。此作用域通常是从父作用域继承的,它是
独立作用域的同级。因此这里
{{name}}
没有访问隔离作用域上的名称。相反,它正在访问
transclude作用域
(并向上游遍历到其父作用域,在那里您不设置
名称

使用
将在父作用域中创建
名称
属性,并将
双向
绑定到指令。这样,更改指令内的值也会更改指令外的值。

检查演示:

因为在调用该指令时,不会传入binding属性

名称
绑定到指令:

<my-dialog name="name">Check out the contents, {{name}}!</my-dialog>
检查内容,{{name}!
因为您使用的是
transclude:true
。Angular将为(
transclude scope
)转包内容创建一个单独的范围,即,
签出内容,{{name}。此作用域通常是从父作用域继承的,它是
独立作用域的同级。因此这里
{{name}}
没有访问隔离作用域上的名称。相反,它正在访问
transclude作用域
(并向上游遍历到其父作用域,在那里您不设置
名称

使用
将在父作用域中创建
名称
属性,并将
双向
绑定到指令。这样,更改指令内的值也会更改指令外的值。

冲突范围 您有一个问题,因为您有一个转移范围和一个隔离范围冲突。删除
scope:{name:'='}
以在控制器作用域上插入
name
。除非需要防止范围继承父范围或与父范围冲突,否则通常不需要隔离范围

如果需要隔离指令的作用域,则不要删除上述内容,将name属性添加到元素中,并将其设置为要使用的scope属性:
name=“name”

鉴于以下情况:

scope: {
  name: '='
}
这意味着您将双向绑定到元素的
name
属性中定义的scope属性,并在隔离scope上调用它的名称。如果您说
somename:'=thatName'
,那么您将两个绑定到
thatName
属性,但在隔离范围中将其称为“somename”

在双向绑定中,指令作用域的更改将影响父作用域。如果要单向绑定(更改不会影响父级),可以使用
name:'@'
,如果要绑定到name属性的值,可以使用
name:'&'

冲突作用域 您有一个问题,因为您有一个转移范围和一个隔离范围冲突。删除
scope:{name:'='}
以在控制器作用域上插入
name
。除非需要防止范围继承父范围或与父范围冲突,否则通常不需要隔离范围

如果需要隔离指令的作用域,则不要删除上述内容,将name属性添加到元素中,并将其设置为要使用的scope属性:
name=“name”

鉴于以下情况:

scope: {
  name: '='
}
这意味着您将双向绑定到元素的
name
属性中定义的scope属性,并在隔离scope上调用它的名称。如果您说
somename:'=thatName'
,那么您将两个绑定到
thatName
属性,但在隔离范围中将其称为“somename”


在双向绑定中,指令作用域的更改将影响父作用域。如果要单向绑定(更改不会影响父级),可以使用
name:'@'
,如果要绑定到name属性的值,可以使用
name:'&'

知道为什么不隐藏此文本吗?:知道这篇文章为什么不隐藏吗