0

我有一个看起来像这样的指令:

return {
                restrict: 'A',
                replace: true,
                scope: {
                    personId: '@',
                    relationshipId: '@',
                    relationshipColumnsShown: '@',
                    personColumnsShown: '@'
                },
                templateUrl: 'app/views/communication/displayList.html',
                controller: controller,
                require: ['$scope', 'communicationLogDataService']
            };

您可以看到有一个名为 personId 的属性,我在使用上述指令的父指令中设置它,如下所示

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

您可以看到 personId 被设置为 parent 指令中的 currentPerson.Id 属性。现在在子指令中,我对 personId 值进行了监视设置。当子指令第一次加载并且值未定义时,这个手表只会被点击一次。首次加载时,父级上的 currentPerson 尚不存在,因为它是异步加载的。在父母中(不确定这是否是导致问题的原因)。

所以我的问题是如何将 currentPerson 的 Id 从父级传递到子级的 personId 中?

4

1 回答 1

1

当您将 @ 绑定用于隔离范围时,它只会为您提供属性的字符串值,而不会将其评估为表达式。我对您的 Fiddle 进行了一些更改以使其正常工作。需要添加一个 ng-app,更改指令中的属性名称(驼峰大小写在属性名称模板中不起作用)并在表达式周围放置双花括号,以便对其进行评估。我还添加了一个输入元素,以便您可以看到数据已更新,在这种情况下您不需要手表。结果如下:

http://jsfiddle.net/pkqUn/3/

<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;
}

尽管这会阻止您的指令修改父范围,但我认为使用“=”隔离范围绑定而不是“@”会更清楚,那么您不需要属性值周围的卷曲。

于 2013-09-24T19:54:44.077 回答