未设置指令中的AngularJS隔离作用域变量

未设置指令中的AngularJS隔离作用域变量,angularjs,scope,directive,Angularjs,Scope,Directive,我有一个指令如下所示: return { restrict: 'A', replace: true, scope: { personId: '@', relationshipId: '@', relationshipColumnsShown: '@',

我有一个指令如下所示:

return {
                restrict: 'A',
                replace: true,
                scope: {
                    personId: '@',
                    relationshipId: '@',
                    relationshipColumnsShown: '@',
                    personColumnsShown: '@'
                },
                templateUrl: 'app/views/communication/displayList.html',
                controller: controller,
                require: ['$scope', 'communicationLogDataService']
            };
您可以看到有一个名为personId的属性,我正在使用上述指令的parent指令中设置它

<div data-display-communication-log="" data-personId="currentPerson.Id" data-relationship-Columns-Shown="true" data-person-Columns-Shown="false">
</div>

您可以从父指令中看到personId被设置为currentPerson.Id属性。现在在child指令中,我在personId值上设置了一个watch。当第一次加载child指令且值未定义时,此手表仅被击中一次。第一次加载时,父级上的currentPerson还不存在,因为它是异步加载的。在父级中(不确定这是否是导致问题的原因)


因此,我的问题是如何将currentPerson的Id从父级传递到子级的personId?

当您对隔离范围使用@binding时,它只提供属性的字符串值,而不会将其作为表达式进行计算。我对你的小提琴做了几处改动,使它能用。如果需要添加ng应用程序,请更改指令上的属性名称(camel case在属性名称模板中不起作用),并在表达式周围放置双卷曲,以便对其进行计算。我还添加了一个输入元素,这样您就可以看到数据得到更新,在这种情况下您不需要手表。结果如下:


**
var myApp=angular.module('myApp',[]);
myApp.directive('personselect',function(){
返回{
模板:“test{{relationshipId}}”,
限制:“A”,
替换:正确,
范围:{
关系ID:“@”
}
};
});
函数myCtrl($scope){
$scope.currentLog={};
$scope.currentLog.RelationshipId=123;
}

虽然这会阻止您的指令修改父作用域,但我认为使用“=”隔离作用域绑定而不是“@”会更清楚,这样您就不需要在属性值周围使用卷曲了。

请共享一把小提琴您是否尝试过“=”而不是“@”?我已经尝试了=和@。@对于我所做的更为正确,因为我只想让信息从父母传递给孩子,但我尝试过Angular和JS这两种非常新的方法,所以我以前从未真正创建过小提琴。我在小提琴设置上遇到了麻烦。以下是我尝试做的基本内容,但即使这样也不起作用。如果你能帮助我理解我在小提琴上遗漏了什么,我可以继续这个例子。我想我错过了什么。我点击了你提供的链接,没有看到你提到的更改。对不起,我忘了点击小提琴上的更新。我更新了答案中的链接。我习惯于使用Plunker而不是JSFIDLE。谢谢你的帮助。我相信我真正的代码中唯一的问题就是大写部分。酷,这就是我在修好小提琴后的想法。很乐意帮忙。
<div ng-app="myApp" ng-controller="myCtrl">  
    <input ng-model="currentLog.RelationshipId"></input>
      <div>
          *<div data-personselect="" data-relationship-id="{{ currentLog.RelationshipId }}"></div>*
      </div>
</div>

var myApp = angular.module('myApp',[]);

myApp.directive('personselect', function() {
    return {
        template: '<span> test {{ relationshipId }}<span>',
            restrict: 'A',
            replace: true,
            scope: {
                relationshipId: '@'
            }
        };
});

function myCtrl($scope){
    $scope.currentLog = {};
    $scope.currentLog.RelationshipId = 123;
}