Angularjs 角度指令范围与替换值的工作方式不同

Angularjs 角度指令范围与替换值的工作方式不同,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我有一个指令,其源代码如下所示: var app = angular.module("myApp", ["mytemplate.html"]) var thai = angular.module("mytemplate.html", []).run(['$templateCache', function ($templateCache) { $templateCache.put('mytemplate.html', '<ul ng-if="true"> <li&g

我有一个指令,其源代码如下所示:

var app = angular.module("myApp", ["mytemplate.html"])
var thai =  angular.module("mytemplate.html", []).run(['$templateCache',
  function ($templateCache) {
    $templateCache.put('mytemplate.html', '<ul ng-if="true"> <li> <a ng-click="next()" href="javascript:void(0)">&raquo;</a> </li> </ul>');
  }
]);

thai.directive('myTop',function() {
return {
    restrict: 'A',
    replace: false,
    scope: {

    },
    templateUrl: 'mytemplate.html',
    link: function (scope) {
        scope.next = function () {
            alert('Hello!');
        };
    }
}
});
var-app=angular.module(“myApp”,[“mytemplate.html”])
var thai=angular.module(“mytemplate.html”,[])。运行(['$templateCache',”,
函数($templateCache){
$templateCache.put('mytemplate.html',';
}
]);
thai.directive('myTop',function(){
返回{
限制:“A”,
替换:false,
范围:{
},
templateUrl:'mytemplate.html',
链接:功能(范围){
scope.next=函数(){
警惕(“你好!”);
};
}
}
});
这是你的电话号码

当我点击“>>”按钮时,它工作正常(提示“你好”)。但是,如果我将指令中的
replace
值从
false
更改为
true
(并单击FIDLE中的更新代码),警报将不再工作


我以为这个范围是分离的,但我不知道为什么?你能告诉我这里的原因吗?非常感谢

您在锚中为href分配的javascript函数就是问题所在。无论此处的“替换”值如何,它都有效


为什么这会阻止它工作,我不完全确定。但是对于锚,您可以正常地说
href=“”
href=“#”

如果您设置
范围:false
,它将解决您的问题

thai.directive('myTop',function() {
return {
    restrict: 'A',
    replace: false,
    scope: false,
    templateUrl: 'mytemplate.html',
    link: function (scope) {
        scope.next = function () {
            alert('Hello!');
        };
    }
}
});

您有
作用域:{}
,它创建了一个隔离作用域。这导致模板中的
ng if
指令出现问题。

否,您已将ng if条件从ul移动到标签。如果您更改href但不更改ng If条件,则它不起作用。是否有理由使用
ng If
条件?我一定是认为它是错误的,或者是在试图找到解决方案时留下的,所以才把它删除了。我是故意这么做的。因为这只是一个演示,所以我倾向于阅读。例如,除了
    之外,我们还有许多
  • ,if条件对整个
      标记产生影响,而不仅仅是
    • 标记。我认为隔离范围与指令配合得很好。正如我所描述的,如果我使用的隔离范围和替换值为false,它仍然工作得很好。您想实现什么?在与
      ng if
      指令共享作用域的元素上,为什么需要具有
      replace:true
      scope:{}
      的指令?你能用
      ng show
      来代替吗?谢谢@georgeawg实际上,我想用指令来处理一些参数,但这只是演示,所以我让它成为最简单的例子。我认为替换和范围没有关系。这里是属性指令,所以我认为replace=true只需将指令的整个模板更改为控制器模板中的我的div。正确:
      replace
      &隔离范围在很大程度上是互斥的(除了那些声明其他指令参数的实例。
      replace=true
      意味着它将替换声明它的DOM元素。如果指令依赖于其他属性,则需要以某种方式复制它们或手动替换。我不建议在大多数美国使用
      replace=true
      )e例。