zoukankan      html  css  js  c++  java
  • AngularJS在自定义指令中传递Model

    本文是对AngularJS权威指南8.2节的理解,书中的解释比较混乱,花了一些时间才理解作者表达的意思。

    假如我们创建了一个指令,用于生成一个包含input和a标签。如果我们想input标签的内容通过ng-model的方式传递出去(例如传递到指令外的另一个input),我们可能会这么写:

    <!doctype html>
    <html ng-app="myApp">
    <head>
        <script src="angular.js"></script>
    </head>
    <body>
    <input type="text" ng-model="myUrl"/>
    <div my-directive
         some-attr="{{myUrl}}"
         my-link-text="Click me to go to Google"></div>
    <script>
        angular.module('myApp', [])
                .directive('myDirective', function() {
                    return {
                        restrict: 'A',
                        replace: true,
                        scope: {
                            myUrl: '@someAttr',
                            myLinkText: '@'
                        },
                        template: '
              <div>
                <input type="text" ng-model="myUrl" />
                <a href="{{myUrl}}">{{myLinkText}}</a>
              </div>
            '
                    }
                })
    </script>
    </body>
    </html>

    生成的HTML如下图所示:

    这里写图片描述

    但是这不能达到我们的预期:数据只能从第一个input传递到第二个input,而不能从第二个input传递到第一个input。

    原因是指令内部有独立的作用域,指令内的{{myUrl}}不能直接被外部共享。

    将代码做如下修改,可以实现被外部共享,注意修改的部分有注释:

    <!doctype html>
    <html ng-app="myApp">
    <head>
        <meta charset="utf-8"/>
        <script src="angular.js"></script>
    </head>
    <body>
    <input type="text" ng-model="myUrl"/>
    <!--*****************************************-->
    <!--{{myUrl}}改为了myUrl-->
    <div my-directive
         some-attr="myUrl"
         my-link-text="Click me to go to Google"></div>
    <!--*****************************************-->
    <script>
        angular.module('myApp', [])
                .directive('myDirective', function() {
                    return {
                        restrict: 'A',
                        replace: true,
                        scope: {
                            //*****************************************
                            myUrl: '=someAttr',//@修改为了=
                            //*****************************************
                            myLinkText: '@'
                        },
                        template: '
              <div>
                <input type="text" ng-model="myUrl" />
                <a href="{{myUrl}}">{{myLinkText}}</a>
              </div>
            '
                    }
                })
    </script>
    </body>
    </html>

    总结

    指令内部model共享到外部,只需要将”@”改为”=”,并且将对应的指令的{{}}删掉即可。

  • 相关阅读:
    KVM + LinuxBridge 的网络虚拟化解决方案实践
    netfilter/iptables 防火墙
    Linux 的路由功能
    使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
    the quieter you become,the more you could see.
    ghost和WINHEX磁盘备份功能的区别
    快速格式化和非快速格式化
    软件是如何控制硬件的?
    如何思考一个问题?
    遇到劣质空气开关了
  • 原文地址:https://www.cnblogs.com/qs20199/p/4452266.html
Copyright © 2011-2022 走看看