【问题标题】:AngularJS - Change the scope of a directiveAngularJS - 更改指令的范围
【发布时间】:2013-10-16 19:43:32
【问题描述】:

我正在尝试设置一个 Angular 指令,以便我可以重用一段 HTML。我已经设法实现了这一点,但我面临的问题是,当我想从包含的 HTML 中将一些值传递给模板化的 HTML 时。

为简单起见,我将使用具有多个地址的客户的示例(在此上下文中,客户是一个对象,每个地址实例都是附加到客户的另一个对象)。

数据示例:

var customer = {
    forename: "John",
    surname: "Smith",
    address1: {
        street: "123 Street",
        town: "Georgeville",
    },
    address2: {
        street: "67 Maple Grove",
        town: "SomeTown"
    }
};

这是我的指令设置示例:

var module = angular.module(...);
module.directive("address", function () {
    return {
        restrict: 'A',
        templateUrl: '/AddressView.html'
    };
});

以及我的尝试用法:

<div ng-model="customer">
    <div address></div>
    <div address></div>
</div>

这就是我想要将客户的地址传递给模板化 HTML 的方法:

<div ng-model="customer">
    <div address ng-model="customer.address1"></div>
    <div address ng-model="customer.address2"></div>
</div>

我可能误解了指令的目的,或者这可能是不可能的,但如果有人有任何建议,将不胜感激。

如果您需要我添加更多信息,请告诉我。

编辑

这是我设置的Plunker,试图说明我想要实现的目标。

【问题讨论】:

    标签: javascript html angularjs angularjs-directive


    【解决方案1】:

    你需要隔离你的指令的范围,这样事情就不会因为角度而混淆。 这样你的对象结构会更好:

    var customer = {
        forename: "John",
        surname: "Smith",
        addresses: [
            address1: {
                street: "123 Street",
                town: "Georgeville",
            },
            address2: {
                street: "67 Maple Grove",
                town: "SomeTown"
            }
        ]
    };
    

    这样你就可以做到:

    <div class="customer">
        <div address ng-repeat="address in customer.addresses">
            {{address.town}} {{address.street}}
        </div>
    </div>
    

    我不知道你为什么在这里使用 ng-model?!
    这是一个示例,但如果您提供 plunker 并提供示例代码帮助您会更容易。

    更新:

    • 首先,您的 ng-controller 位于错误的位置,您需要将其向上移动,以便地址指令可以在控制器的范围内,以便它可以访问地址对象。
    • 其次,您有 2 个未定义的变量:街道和城镇。
    • 而且您需要隔离作用域,这样每个指令就不会与另一个指令的变量混淆。

    这是一个有效的plunker
    希望对您有所帮助。

    【讨论】:

    • 感谢您的回复。我正在尝试弄清楚如何在多个地方使用address HTML(不一定在对象集合中 - 我可能有我希望传递给它的单个对象)。我将研究建立一个 Plunker 示例。
    • 太棒了!这是我缺少的隔离以及通过指令属性传递对象。是时候阅读范围隔离了。干杯!
    • 查看这个网站egghead,它有一个关于 AngularJS 的精彩视频,并将范围从视频 16 到 20 和其他有趣的东西隔离开来。
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多