如何在子作用域中从指令中设置Angular控制器对象的属性值。
如何在子作用域中从指令中设置Angular控制器对象的属性值。
我在ng-repeater内部有一个指令,应该设置一个作用域属性。\n请在这里查看fiddle:http://jsfiddle.net/paos/CSbRB/\n问题是作用域属性被设置为一个属性值,如下所示:\n
\n该指令应该将作用域属性inputdata.title设置为某个字符串。但这不起作用:\n
app.directive('ngUpdate1', function() { return function(scope, element, attrs) { element.bind('click', function() { scope.$apply(function() { scope[ attrs.ngUpdate1 ] = "Button 1"; }); }); }; });
\n然而,直接赋值是有效的:\n
scope["inputdata"]["title"] = "Button 1";
\n请告诉我如何通过指令使用点符号设置作用域属性的名称?\n附注:fiddle使用重复器的原因是它使指令处于子作用域中。当它们处于子作用域中时,无法写入原始类型的作用域属性。这就是为什么我需要一个带有\".\"的对象属性的原因。请参见这里的详细解释:什么是AngularJS中作用域原型/原型继承的细微差别?\n谢谢。
问题的原因是当一个指令使用一个属性指定作用域属性,并且想要修改该值时,它不能直接修改,需要使用$parse或$eval来解析并修改该值。
解决方法是使用$parse或$eval来解析并修改作用域属性的值。如果想要修改该值,可以使用$parse,如果不需要修改,可以使用$eval。
以下是使用$parse的示例代码:
app.directive('ngUpdate1', function($parse) { return function(scope, element, attrs) { var model = $parse(attrs.ngUpdate1); console.log(model(scope)); // logs "test" element.bind('click', function() { model.assign(scope, "Button 1"); scope.$apply(); }); }; });
以下是使用$eval的示例代码:
console.log(scope.$eval(attrs.ngUpdate1));
如果想要使用ng-model作为HTML属性而不是自定义属性,并且指令是在链接函数中使用的,那么需要在一个新的问题中提出,并提供一个相关的示例。答案也取决于指令使用的作用域类型。可以参考这个链接:[ngmodel and component with isolated scope](http://stackoverflow.com/questions/11896732)。
最后,如果问题已经解决了,可以提供一个相关的示例来说明解决方法。