Javascript 角度-从指令赋值

Javascript 角度-从指令赋值,javascript,angularjs,Javascript,Angularjs,我有一个Angular指令,其行为类似于ng include,只是带有制表符。 因此它有一个分层范围:true 要获取和设置父作用域的变量值,我使用$parse: var modelFn=$parseattrs.ngModel 获取类似于var value=modelFnscope偶数scope.$evalattrs.ngModel的良好工作状态, 但赋值不会更改父范围上的值,它实际上会在当前范围上创建一个变量: modelFn.assignscope,{…} 这太令人沮丧了,有什么帮助吗? 提

我有一个Angular指令,其行为类似于ng include,只是带有制表符。 因此它有一个分层范围:true

要获取和设置父作用域的变量值,我使用$parse:

var modelFn=$parseattrs.ngModel

获取类似于var value=modelFnscope偶数scope.$evalattrs.ngModel的良好工作状态, 但赋值不会更改父范围上的值,它实际上会在当前范围上创建一个变量:

modelFn.assignscope,{…}

这太令人沮丧了,有什么帮助吗? 提前谢谢

更新: 这里有一个例子

HTML:

指令:

{
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'});
}
}
}

在javascript中,对象具有原型

当您指定scope:true时,您告诉指令要从父作用域继承一个作用域原型

这意味着您可以有一个到原型父范围的特殊链接,在这里您可以访问所有is值和对象,以及所有is方法,直到。。。您尝试为这些值、对象和方法编写内容

您可以看到prototype有回退,当您的对象上没有值/对象/方法时,它将尝试查看is prototype。 但是当你想设置一个值/对象/方法时,你实际上是在你的对象上设置它,而不是在原型上,所以你的父范围值/对象/方法会随之改变

一段代码来说明:

要知道的一个有趣的事实是,如果通过原型更改对象访问的值之一,那么原型对象中的值也会更改

因此,对于当前的问题,您只需更改直接访问值,比如$scope.title=My title;按$scope.properties={title:'My title'};并通过$scope.properties.title访问它。当您在对象指令继承的范围内更改它时,它将在其原型父范围内更改


我希望这很清楚。

为什么不使用双向绑定将变量传递给指令呢?以下内容将绑定myParam,因此当您在指令中更改它时,它也将在调用范围中更改:

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

... etc...

};
})
HTML:


为什么不能只使用scope.$parent?为什么要使用$parse?您应该显示更多代码来解释您正在尝试执行的操作。我不清楚为什么以及如何使用NGModel。它并不总是直接的家长。。我不能再多表现了,老板不允许,反正这就是原因problem@YuvalSaraf,您不需要显示精确的代码-事实上,请不要。你应该创建一个说明性的例子用一个例子更新问题,这个例子在角度上创建了一个孤立的范围。。对于ng include没有好处,因为表达式将无法从父对象的作用域中了解任何内容。这意味着,如果有人想使用我的指令,他不能像$scope.myData那样直接将变量放在作用域中,而在html put ng model='myData'中,他需要像这样将变量放在对象中:$scope.vm.myData ng model='vm.myData'。我想避免开发人员提出这样一个奇怪的要求……在这种情况下,使用隔离的范围,而不是继承的范围,
<my-directive my-param = "foo"><my-directive/>