bin*_*ant 33 angularjs angularjs-directive angularjs-scope
我需要从指令中的父控制器继承范围.我不一定要留下范围:false.我也不一定想要使用隔离范围,因为它需要大量的工作才能使我关心的值正确链接(在父控制器中考虑很多值).
scope:true如果我想更新父范围,在我的指令中使用是否有意义?
<div ng-controller="MyCtrl">
Hello, {{name}}!
<my-directive></my-directive>
</div>
Run Code Online (Sandbox Code Playgroud)
var myApp = angular.module('myApp',[]);
//myApp.directive('myDirective', function() {});
//myApp.factory('myService', function() {});
function MyCtrl($scope) {
$scope.name = 'Dave';
}
myApp.directive('myDirective', function() {
return {
scope: true,
restrict: 'EA',
link: function(scope, elem, attrs) {
scope.updateName = function(newName) {
console.log('newName is: ' + newName);
scope.name = newName;
}
},
template: '<input ng-model="updatedName" placeholder="new name value"> <button ng-click="updateName(updatedName)">Update</button>'
}
})
Run Code Online (Sandbox Code Playgroud)
请查看小提琴
Mar*_*cok 51
虽然@ user1737909已经引用了SO问题(AngularJS中范围原型/原型继承的细微差别?,这将解释问题并推荐各种方法来解决它),但我们通常会尝试给出答案.
因此,你的小提琴不起作用的原因是因为当原始类型(即字符串,数字或布尔类型)被写入时 - 例如,scope.name = newName- "写"总是转到本地范围/对象.换句话说,子范围获取其自己的name属性,该属性隐藏同名的父属性.修复是在父作用域中使用对象而不是基本类型.然后,子范围将获得对该对象的引用.对对象属性的任何写入(无论是来自父对象还是子对象)都将转到该对象.(子范围没有自己的对象.)
$scope.obj = {name: 'Dave'};
Run Code Online (Sandbox Code Playgroud)
然后在你的指令中:
scope.obj.name = newName;
Run Code Online (Sandbox Code Playgroud)
和HTML:
Hello, {{obj.name}}!
Run Code Online (Sandbox Code Playgroud)
lib*_*b3d 15
范围继承不意味着设置子的值是设置其父级的值.
不要scope.name = newName对子作用域执行操作,而是将方法添加到父作用域,该作用域将在父作用域上执行相同的作业,并从子作用域调用它,因为子作用继承了此方法.
| 归档时间: |
|
| 查看次数: |
37134 次 |
| 最近记录: |