【问题标题】:Why is my angular directive not getting Parent controller scope inside isolated scope?为什么我的角度指令没有在隔离范围内获得父控制器范围?
【发布时间】:2015-05-05 19:59:41
【问题描述】:

我已经精确地遵循 Angular 文档来获得一个指令,该指令使用一个隔离范围,其中包含来自父控制器范围对象的几个 var。

app.controller('MainCtrl', function($scope) {
    $scope.name = 'Parent Name';

    $scope.pokie = {
        whyIs: "thisUndefined?"
    };
});

app.directive('parseObject', function() {

    var preLink = function($scope, el, att, controller) {
        console.log('[link] :: ', $scope);
    };

    var postLink = function($scope, el, att, controller) {
        console.log('[PostLink] :: ', $scope);
        console.log('[$Parent] :: ', $scope.$parent.name);
    };

    return {

        restrict: 'E',
        scope: {
            myPokie: '=pokie',
            name: '=name'
        },
        template: [
          '<div>',
          '<h1>Directive does not get parent scope</h1>',
          '<h1>{{ myPokie }}</h1>',
          '<h2>{{ name }}</h2>',
          '</div>'
        ].join(''),

        compile: function() {
            return {
                pre: preLink,
                post: postLink
            }
        }
    }
});

http://plnkr.co/edit/FpQtt9?p=preview

谁能告诉我我的代码有什么问题?为什么指令的 Isolate 范围会为“myPokie”和“name”返回未定义的值?

我看到其他人说你必须为此使用 $scope.watch.. 但是 angular 的指令文档没有说明这一点.. 我真的不想使用 $scope.watch 做某事如此琐碎,应该开箱即用。

【问题讨论】:

    标签: javascript angularjs angularjs-directive angularjs-scope isolate-scope


    【解决方案1】:

    当您在指令中声明隔离范围时,这意味着您将使用属性将这些值提供给您的指令。

     scope: {
         myPokie: '=pokie',
         name: '=name'
     }
    

    这意味着您的指令范围不会从父范围原型继承。 pokie 属性提供 myPokie 的值 & name 属性将为您的指令提供 name 的值,= 指示双向绑定如果您的 myPokie 值在指令中更改,相同的引用值将更改父控制器。 name 属性也是如此。

    你的指令元素标记应该是:

    <parse-object pokie="pokie" name="name"></parse-object>
    

    Working Plunkr

    【讨论】:

    • 谢谢,更喜欢你的简短回答:)
    • 是否可以将这些值从控制器范围获取到一个独立的指令范围中,而无需在指令 html 代码中再次定义它们? 当我只想在指令中使用控制器范围内的一些变量时,感觉是多余的......
    • @user1383029 为什么你觉得这些变量是多余的......?您正在创建一个组件,该组件可以放置在您的应用程序中的任何地方,需要某些值集可以通过属性传递..假设您有一个页面两次具有相同的指令..它将如何工作..而不是您问如何在不将值传递到指令的隔离范围内的情况下访问值,那么您需要在访问父范围值时使用 $parent 注释..
    【解决方案2】:

    您正在使用隔离范围,但您没有传递变量。问题出在您的 HTML 中:

    从以下位置更改您的 HTML:

    <parse-object></parse-object>
    

    收件人:

    <parse-object pokie="pokie" name="name"></parse-object>
    

    隔离作用域从 DOM 元素中获取参数。因此,如果您在范围内声明:

    myPokie: '=pokie',
    

    这意味着myPokie 变量应该取自范围内的pokie 属性。您的name: "=name" 可以更改为name: "=",因为它的名称完全相同。

    Plunker

    【讨论】:

    • 我比你少了 17 秒 :p
    • @pankajparkar 是的,我必须再输入一些 :)
    • 我要输入的不止这些……这就是我要花时间的原因:p
    • 现在它比你长一点..:p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多