一尘不染

是否可以使用范围:true从Angular Directive更新父范围。

angularjs

我需要从指令中的父控制器继承范围。我不一定要离开范围:false。我也不一定要使用孤立的作用域,因为要获得我确实关心的值正确链接(需要在父控制器中考虑很多值),就需要大量的工作。

scope:true如果要更新父范围,在我的指令中使用是否有意义?

<div ng-controller="MyCtrl">
      Hello, {{name}}!
        <my-directive></my-directive>
</div>



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

请检查小提琴


阅读 208

收藏
2020-07-04

共1个答案

一尘不染

尽管@user1737909已经引用了SO问题来阅读(AngularJS中范围原型/原型继承的细微差别是什么?它将解释该问题并建议各种解决方法),但我们通常会尝试在SO上给出答案。

因此,您的小提琴无法工作的原因是因为在将原始类型(例如,字符串,数字或布尔类型)写入(例如,scope.name =newName)“写入”时,总是将其转到本地范围/对象。换句话说,子作用域获得了自己的name属性,该属性遮盖了同名的父属性。解决方法是在父范围内使用一个对象,而不是原始类型。然后,子作用域将获得对该对象的引用。对对象属性的任何写入(无论是从父对象还是从子对象)都将转到该对象。(子作用域没有得到自己的对象。)

$scope.obj = {name: 'Dave'};

然后在您的指令中:

scope.obj.name = newName;

和HTML:

Hello, {{obj.name}}!

[fiddle](http://jsfiddle.net/mrajcok/c8pZs/)

2020-07-04