2015-02-09 103 views
0

分配我有一个Angular指令,其行为像ng-include,只是带有选项卡。 所以它有一个分层范围(scope: true)。角 - 从指令

获取和设置父作用域的变量值我使用$解析:

var modelFn = $parse(attrs.ngModel);

获得优良工程这样var value = modelFn(scope)甚至scope.$eval(attrs.ngModel), 但分配父范围不会改变的价值,它实际上创建在当前范围的变量:

modelFn.assign(scope, { ... });

这是令人沮丧的,任何帮助吗? 在此先感谢!

更新: 下面是一个例子

HTML:

<myDirective ng-model="myData"></myDirective>

指令:

{ 
replace: false, 
scope: true, 
template: '<button ng-click="changeData()"></button><div ng-include="templateUrl"></div>' 
link: function(scope, element, attrs){ 
var modelFn = $parse(attrs.ngModel); 
var value = modelFn(scope); 
scope.templateUrl = data.replace('a', 'b'); 
scope.changeData = function(){ 


// Problem is here, assignment is on the current scope and not parent (or parent's parent and etc..) 
modelFn.assign(scope, {name: 'new Value'}); 
} 
} 
} 
+0

为什么你就不能使用'$范围父'?为什么'$ parse'? – Claies 2015-02-09 22:24:03

+0

你应该展示更多代码来解释你正在尝试做什么。我不清楚为什么以及如何使用ngModel – 2015-02-09 22:28:25

+0

它并不总是直接的父母.. 我不能显示更多,老板不允许,反正这是解释问题 – 2015-02-09 22:34:11

回答

0

在JavaScript对象都有原型。

当您指定scope: true时,您告诉该指令具有从父范围原型继承的范围。

这意味着你得到一个特殊的链接到父范围(原型),在那里你可以访问所有的值和对象,所有的方法,直到...你试图为这些值写东西,对象和方法。

你可以看到原型有后备,当你的对象上没有任何值/对象/方法时,它会尝试着看原型。 但是,当你想设置一个值/对象/方法,你实际上将它设置在你的对象上,而不是原型,所以你的父范围值/对象/方法会改变。

的代码位来说明:

https://gist.github.com/bcharp/712d6d9bfaf55b3c5d81

一个有趣的事实知道的是,如果你改变通过原型访问对象的价值之一,这将是在原型对象中的变化。

因此,对于你目前的麻烦,你可以简单地改变你的直接访问值说通过$scope.properties = {title:'My title'};$scope.title = "My title";和访问它通过$scope.properties.title当你改变它的对象内部(指令继承范围),这将是他的原型改变(父范围)。

我希望它很清楚。

+0

所以这意味着如果任何人想使用我的指令,他不能直接将变量放在作用域上,就像这个'$ scope.myData'一样(并且在html put “ng-model ='myData'”),他需要像这样放入一个对象:'$ scope.vm.myData'(“ng-model ='vm.myData'”)。 我想避免开发人员这样一个奇怪的要求... – 2015-02-10 05:32:52

+0

那么在这种情况下使用隔离范围,而不是继承一个,https://docs.angularjs.org/guide/directive#isolating-the-scope-of -a-directive – 2015-02-10 09:40:57

0

为什么不使用双向绑定将变量传递给指令?下面将结合myParam这样,当你在指令改变它也将在呼叫范围发生变化:

.directive('myDirective', function() { 
    return { 
    scope: { 
     myParam: '=' 
    }, 
    templateUrl: 'template.html', 
    controlle: MyCtrl 

... etc... 

}; 
}) 

HTML:

<my-directive my-param = "foo"><my-directive/> 
+0

这是在angular中创建一个独立的作用域..对ng-include没有好处,因为表达式不会从父级的作用域知道任何东西 – 2015-02-09 22:55:50