使用$ scope隔离范围功能。$ new inheritance?

时间:2013-06-03 10:15:15

标签: javascript angularjs

我正在试图弄清楚是否可以获得可以从隔离范围获得的属性绑定的自动功能:

scope : { someAttr: '@' }

同时保留scope.$new()的透明范围 - > parentScope属性访问权限:

$scope.foo = 'foo';
$scope.bar = 'bar';

var childScope = $scope.new();
childScope.foo = 'childFoo';

// childScope == { foo: 'childFoo', bar: 'bar' }

想法?我不确定如何在控制器中创建一个新的作用域,然后将指令中的属性发送到... ???

要明确我最终想要一个控制器:

$scope === {
           attr : << attribute from directive instance >>
    , parentKey : << transparent to parent diretive's scope >>
}

1 个答案:

答案 0 :(得分:1)

这样做自己真的很简单。您使用$parse服务将表达式转换为函数,然后在范围上公开该函数。

Angular在指令代码中遇到&范围时内部的作用是:https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L892-L898

所以你可以制作一个小帮手功能,在你想要的属性上为你做这个三线程。

/*
 * Creates a child scope, turning the property names in the whatToGetter
 * array into getters
 * @param parentScope scope to inherit
 * @param whatToGetter array of string properties to turn into getters 
 *                     of the parent on the child scope
 * @returns scope new child scope
 */
function childScope(parentScope, whatToGetter) {
  var child = parentScope.$new();
  angular.forEach(whatToGetter, function(property) {
    var getter = $parse(parentScope[property]);
    child[property] = function() {
      return getter(parentScope);
    };
  });
  return child;
}

var scope = {foo: '1', bar: '2'};
var child = childScope(scope, ['bar']);
console.log(child.foo); // --> 1
console.log(child.bar()); // --> 2