首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有模板的指令和没有模板的指令范围以及角度1.2和1.1的区别?

有模板的指令和没有模板的指令范围以及角度1.2和1.1的区别?
EN

Stack Overflow用户
提问于 2014-01-05 12:32:38
回答 1查看 3.6K关注 0票数 5

我是新的角度,并试图理解高级指令API -我想重新创建指令模板在编译函数使用指令元素属性。但是,当我没有模板集(或者模板是空字符串)而不是访问孤立的指令范围时,我就访问父(控制器)作用域。这也适用于角1.1,而不是1.2。

下面是HTML:

代码语言:javascript
复制
<div class="container" ng-app="app" ng-controller="AppController">
      <sandbox title="Attribute Title"></sandbox>
</div>

JavaScript:

代码语言:javascript
复制
var app = angular.module('app', [], function () {});

app.controller('AppController', function ($scope) {
    $scope.title = "AppController title";
});

app.directive('sandbox', function ($log, $compile) {
    return {
        restrict: 'E',
        scope: {
            title: "@"
        },
        controller: function ($scope, $element, $attrs) {
            $scope.title = "Directive Controller title";
        },
        template: '<h1>Template</h1>', // change it to: '' and Run, than change Angular to 1.2.x
        compile: function (tElement, tAttrs) {
            tElement.append('<h2> Title = {{ title }}</h2>');
        }
    }

});

当你运行它时,你会得到:

模板

Title =属性标题

但是,当您将模板更改为空字符串时,您将得到角1.2:

Title = AppController Title

角为1.1.1:

Title =属性标题

我的问题:

为什么在设置模板时访问范围与未设置模板时存在差异?

为什么角1.1和1.2之间有区别(错误?-没有模板的指令,以及被隔离的作用域,控制器范围,而不是指令范围) ?

如何在编译函数中构建访问独立作用域而不是父作用域的模板?

为什么指令控制器函数不使用$scope.title =“.”更改'title‘,但是当调试'link’函数中的' scope‘param’标题‘值’时,它在内部(查找它的位置)绑定孤立的作用域‘属性值’?

下面是要玩的JSFiddle:http://jsfiddle.net/yoorek/zQ66L/4/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-05 17:01:01

您已经发现了在1.2中发生的一个重大变化(以及使用“@”的一个怪癖)。

1)当您的模板是时,没有看到要将隔离作用域应用到的模板。这是1.2中的一个问题的原因在于你的第二个问题的答案。

2) --这是这1.2个变化的结果-- 使隔离范围真正隔离

隔离作用域现在只对请求它的隔离指令及其模板可用。

因此,如果没有模板,就会将其附加到隔离作用域之外的元素。

来自https://github.com/angular/angular.js/issues/4889

由于我们无法区分最初在html文件中的标记和在编译函数中添加的标记,后者也没有获得隔离作用域。

应使用模板属性替换编译函数中的...additional标记。 这个想法是模板属性也可以是一个函数。如果它是一个,它将获得编译元素和编译属性作为参数。

3)正如您在上面看到的,(POT1.2)实际上是在推动您在这里使用模板而不是编译函数。您最好的选择是以使用编译的方式使用模板函数。或者,您可以在$compile中使用链接函数,但这可能会增加不必要的复杂性。

通过在编译函数中添加内容,您可以有效地添加到模板中,这样就可以避免这种情况了。

4)这与@的工作方式有关。来自安古拉斯范围指南

使用链接函数中的attr_name(‘attr_name’)函数{.}来获得使用'@‘表示法的隔离作用域属性的内插值。例如,如果我们在链接函数中有-- attrs.$观察者(‘插值’,函数(值){.}-值将设置为11。(scope.interpolatedProp在链接函数中未定义)。相反,scope.twowayBindingProp是在链接函数中定义的,因为它使用'=‘表示法。

你也可以读到这个因此,在@和=之间的差异上发帖

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20933591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档