当前位置: 首页 > 面试题库 >

AngularJS-指令的链接函数中的访问隔离范围

长孙硕
2023-03-14
问题内容

我首先尝试使用AngularJS自定义指令

我在指令的链接功能中使用(或理解…)隔离范围时遇到麻烦。

这是我应用程序这部分的代码:

view.html

...
<raw-data id="request-data" title="XML of the request" data="request">See the request</raw-data>
...

request 是在viewCtrl范围内发布的变量,其中包含请求的xml字符串。

rawData.js

directives.directive('rawData', function() {

    return {
        restrict : 'E',
        templateUrl : 'partials/directives/raw-data.html',
        replace : true,
        transclude : true,
        scope : {
            id : '@',
            title : '@',
            data : '='
        },
        link : function($scope, $elem, $attr) {
            console.log($scope.data); //the data is correclty printed
            console.log($scope.id); //undefined
        }
    };
});

raw-data.html

<div>
    <!-- Button to trigger modal -->
    <a href="#{{id}}Modal" role="button" class="btn" data-toggle="modal" ng-transclude></a>

    <!-- Modal -->
    <div id="{{id}}Modal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="{{id}}Modal" aria-hidden="true">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
            <h3 id="myModalLabel">{{ title }}</h3>
        </div>
        <div class="modal-body">
            <textarea class="input-block-level" rows="10">{{ data }}</textarea>
        </div>
        <div class="modal-footer">
            <!-- <button class="btn" ng-click="toggleTagText('')">{{'cacher'}} l'image</button> -->
            <button class="btn btn-primary" data-dismiss="modal" aria-hidden="true">Fermer</button>
        </div>
    </div>
</div>

我不明白为什么弹出模式时会显示ID正确,但是当我尝试使用console.log()它时,其值是不确定的。

也许我对隔离的范围值(=@)错了。

感谢您的阅读。:)


问题答案:

与绑定的隔离范围属性@在链接函数中不立即可用。您需要使用$observe

$attr.$observe('id', function(value) {
   console.log(value);
});

您的模板正常工作,因为Angular会自动id为您更新隔离范围属性。并且当它确实更新时,您的模板也会自动更新。

如果只是传递字符串,则只需对值进行一次评估即可,而无需使用@绑定:

link: function($scope, $elem, $attr) {
    var id    = $attr.id;
    var title = $attr.title
    console.log(id, title);
}

但是,在这种情况下,由于要使用模板中的属性,因此应使用@

如果您不使用模板,则@在属性值包含{{}}s
时很有用–例如,title="{{myTitle}}"。然后使用的需求就$observe变得更加明显:您的链接函数可能希望每次myTitle更改值时都做一些事情。



 类似资料:
  • 那么,的目的是什么?不能访问通过传递的所有属性。为什么一个max的访问值不能作为而不是 为什么要像那样分配回来? 谢了。

  • 问题内容: 请在这里查看示例 角需要,,以在所述分离的范围对象从父范围访问它来限定。 在这里使用 那么,目的是什么?无法访问通过传递的所有属性。为什么不能将max的一个访问值代替 为什么要分配回来像? 由于此应用程序是由Angular作者编写的,因此我希望有一个理由。 谢谢。 问题答案: attrs的目的是什么? 在与指令相同的元素上定义的属性有几个用途: 它们是将信息传递到使用隔离范围的指令的唯

  • 如果不使用隔离作用域,我似乎找不到从指令中调用父作用域上的函数的方法。我知道如果我使用隔离作用域,我可以使用“ 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且只有在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。指令如下所示: 但问题是,因为我使用的是隔离作用域,所以上面示例中的ng hide不再针对父作用域执行,而是在隔离作用域中执行(因为在任何指令上使用

  • 问题内容: 我想在没有自己的模板的AngularJS中创建可重用的指令。我也想为该指令设置隔离范围。我的方法的最佳做法是什么?为什么我的示例不符合我的预期? 我希望可以分别从指令中编辑obj1和obj2。 HTML: JS: PLUNKR:http://plnkr.co/edit/Dw8IiFVSOZGjSTFGRMzZ 问题答案: 您的代码现在的工作方式是,每个指令的内容都绑定到父作用域,而不是

  • 问题内容: 我试图在我的指令中使用隔离范围放置一些默认值。基本上,绑定指令后,我需要使用scope对象进行一些DOM操作。下面是我的代码: 控制器: 服务: 指示: 自定义指令元素: 现在,问题是,当尝试在指令内部的默认方法中访问隔离范围时,我在获取数据并将其绑定到DOM的同时获得了未定义的值。如何访问广播侦听器中的隔离作用域并修改指令模板HTML?还有另一个处理这个的麻烦吗? 问题答案: 问题是

  • 问题内容: 我似乎找不到不使用隔离范围从指令内调用父范围内的函数的方法。我知道,如果我使用隔离作用域,则可以在隔离作用域中使用“&”来访问父作用域上的函数,但是在不必要时使用隔离作用域会产生后果。考虑以下HTML: 在这个简单的示例中,我想显示一个JavaScript确认对话框,并且仅当他们在确认对话框中单击“确定”时才调用doIt()。使用隔离范围很简单。该指令如下所示: 但是问题是,因为我使用