是否可以从Angular Directive更新父范围,范围:true?

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)

fiddle


lib*_*b3d 15

范围继承不意味着设置子的值是设置其父级的值.

不要scope.name = newName对子作用域执行操作,而是将方法添加到父作用域,该作用域将在父作用域上执行相同的作业,并从子作用域调用它,因为子作用继承了此方法.


Reb*_*ury 6

在您的链接函数中,您将写入父作用域(全局"$ scope"作用域),如下所示:scope.$ parent.name = newName;