AngularJS - 何时使用隔离范围以及何时使用服务

时间:2014-08-14 17:47:33

标签: angularjs

假设我有一个标记如下(在隔离范围之前):

<div class="myApp">
    <div class="bulletins" ng-repeat="bulletin in myApp.bulletins" bulletins>
        <div class="posts" ng-repeat="post in bulletin.posts" posts>
            <div class="comments" ng-repeat="comment in post.comments" comments>

现在,我说隔离范围:

<div class="myApp">
    <div class="bulletins" ng-repeat="bulletin in bulletins" bulletins="{{ myApp.bulletins }}">
        <div class="posts" ng-repeat="post in posts" posts="bulletin.posts">
            <div class="comments" ng-repeat="comment in comments" comments="post.comments">

从上面的标记中,bulletins是单向绑定,但postscomments是双向绑定。还未示出可以从一个父母传递给孩子或孩子的孩子的所有其他中间范围。这很快就会变得混乱,因为我可能想要来回传递多个变量。

但是,我可以创建一个在myApp内初始化的数据共享服务,并将其注入每个指令并根据需要使用:

app.factory('bulletinsData', function()
{
    var storage = {},
        self    = {};

    // If bulletins provided, then save it, otherwise return it
    storage.bulletins = function(bulletins) {
        if (_.isUndefined(bulletins)) return self.bulletins;
        self.bulletins = bulletins;
    }

    return storage;
});

所以我的问题是你什么时候使用隔离范围,什么时候使用数据共享服务?

1 个答案:

答案 0 :(得分:0)

隔离范围和服务 ahem 服务器完全不同的目的,所以我不会说它们是彼此的替代品。

指令应该是小的,可重复使用的块,因此它们通常不应该与服务交互,因为这种依赖性会降低可重用性。这绝不是一个硬性规定,但要牢记这一点。

你问题的真正答案是:它取决于你。当您创建指令时,想象一下,您可以在任何上下文中的任何地方使用它,而不仅仅是当时如何使用它。您可能希望限制为需要该服务的指令创建依赖项。如果需要重复使用指令,则指令通过隔离范围进行通信。

话虽如此,有多种方法可以做任何事情,但很难说一个比另一个更好。只需保持自己对不同的选项,实验,并找到最适合您的目的的途径。