在ng-repeat中保留范围(不想要子范围)

时间:2014-01-20 15:03:09

标签: angularjs angularjs-directive angularfire

我可能在概念上遗漏了一些东西,但我知道ng-repeat会创建子范围,但对于我的场景,这是不可取的。这是场景。我有一个绑定到firebase数据集的3way绑定。该对象是具有n个子对象的对象。在我当前的代码结构中,我使用ng-repeat来迭代并使用自定义指令渲染这些对象。问题是这些对象意味着“活着”(意味着它们是3向绑定的。最高级别的对象与angularfire $ bind绑定)。

因此,在我的情况下,简单的场景是ng-repeat创建的范围与创建它的范围没有隔离。

我正在寻找有关如何做到这一点的想法?或者关于其他方法的建议。

2 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但我可以帮助使用angularFire部分,而且角色大师可能会为你填补空白(参见// todo)。

首先,不要试图分享范围。将所需的变量简单传递到子范围。由于您需要3向绑定,因此可以使用&在父作用域上调用方法。

例如,要设置此模式:

<div ng-repeat="(key,widget) in widgets">
    <data-widget bound-widget="getBoundWidget(key)"/>
</div>

您可以像这样设置指令:

.directive('dataWidget', function() {
   return {
      scope: {
         boundWidget: '&boundWidget'
      },

      /* your directive here */

      //todo presumably you want to use controller: ... here

   }
});

where&amp; boundWidget调用父$ scope中的方法,如下所示:

.controller('ParentController', function($scope, $firebase) {
    $scope.widgets = $firebase(/*...*/);
    $scope.getBoundWidget = function(key) {
        var ref = $scope.widgets.$child( key );
        // todo, reference $scope.boundWidget in the directive??
        ref.$bind(/*** ??? ***/);
    };
});

现在你只需要有人填写// todo部分!

答案 1 :(得分:0)

您仍然可以访问重复中的父作用域。你只需要使用$ parent。

<强>控制器

app.controller('MainCtrl', ['$scope', function ($scope) {
      $scope.someParentScopeVariable = 'Blah'
      $scope.data = [];
      $scope.data.push({name:"fred"});
      $scope.data.push({name:"frank"});
      $scope.data.push({name:"flo"});
      $scope.data.push({name:"francis"});
}]);

<强> HTML

  <body ng-controller="MainCtrl">
    <table>
        <tr ng-repeat="item in data | filter: search">
            <td>
              <input type="text" ng-model="$parent.someParentScopeVariable"/>
              <input type="text" ng-model="item.name">
            </td>  
        </tr>
    </table>
  </body>

Plunker