Javascript Can';t在Angular指令中从服务访问对象属性

Javascript Can';t在Angular指令中从服务访问对象属性,javascript,angularjs,factory,promise,directive,Javascript,Angularjs,Factory,Promise,Directive,我有一个JSON服务,它输出一个roleName和一个id,我正试图使用这个角色来使用angular指令隐藏或显示应用程序中的元素。似乎正在成功调用该服务,并且正在从输出填充$scope.data,但由于控制台日志读取$scope.data.rolename的未定义,我似乎无法从数据对象访问该角色 .JS 我想我对你来这里的目的有点困惑。您正在创建一个延迟承诺,然后立即解决它?这不是违背了延迟/承诺模式处理异步调用的目的吗?您的SecuritySvc.getRole()方法是否正在执行AJAX调

我有一个JSON服务,它输出一个roleName和一个id,我正试图使用这个角色来使用angular指令隐藏或显示应用程序中的元素。似乎正在成功调用该服务,并且正在从输出填充$scope.data,但由于控制台日志读取$scope.data.rolename的未定义,我似乎无法从数据对象访问该角色

.JS


我想我对你来这里的目的有点困惑。您正在创建一个延迟承诺,然后立即解决它?这不是违背了延迟/承诺模式处理异步调用的目的吗?您的
SecuritySvc.getRole()
方法是否正在执行AJAX调用以返回该数据?我一直认为AJAX调用应该是在完成后调用
Promise::resolve
的线程。您是否尝试过只使用
$http

尽管如此,我还是很困惑,你能成功地运行console.log
data
,但不能运行
data.roleName
<代码>数据显示意味着无论您对延迟/承诺模式做什么,您都会在需要的地方得到响应。此时,您是否确定
数据
对象的结构?
数据
和您的信息之间没有层?我有点惊讶地看到它被角度方法和属性(如
$promise
$resolved
)所掩埋


不知道这些是否有用…

当您的指令创建一个隔离作用域(就像您的指令一样)并且服务正在访问视图控制器(而不是指令控制器)作用域时,我看到了这种行为。由于作用域不同,
$scope.data
对象也不同

您可以通过在指令控制器中放置一个断点和在服务中放置另一个断点来检查作用域id号,并检查$id值。有几种方法可以解决这个问题,但是具体的解决方案取决于您的具体实现

阅读独立作用域绑定-“@”和“=”可能会有所帮助,请参阅:


我把它清理干净,并兑现了承诺,希望这能让事情变得更清楚一些。SecuritySvc.getRole();在控制器中工作,我可以显示data.roleName,但不能在指令中显示。@CitizenSave我可以看出您已经尽了最大努力回答了这里的问题,但在大多数情况下,最好在回答问题之前通过添加注释来获得所需的任何澄清。@Twenty Gototen,谢谢。只要我有足够的声誉,我就会这么做,但我没有意识到这是正确的协议@rlwheeler,这有助于稍微清理代码,但是您能否像那样重新运行它,并为更新的代码复制/粘贴控制台结果?显然,
$promise
$resolved
属性应该消失。我仍然非常困惑,即使是marfarma在下面的回答,如何记录一个对象而不是它的一个成员。
app.directive('restrictTo', ['SecuritySvc', function (SecuritySvc) {
return {
    restrict: 'EA',
    replace: true,
    transclude: true,
    scope: {},
    controller: ['$scope', '$attrs', '$q', 'SecuritySvc', function ($scope, $attrs, $q, SecuritySvc) {
        $scope.data = SecuritySvc.getRole();

            if ($scope.data.roleName == $attrs.restrictTo) {
                $scope.allowed = true;
            } else {
                $scope.allowed = false;
            }

            console.log($scope.data); // showing in log
            console.log($scope.data.roleName); // Undefined

    }],
    template: '<div ng-show="{{ $scope.allowed }}" ng-transclude></div>'
}
$promise: Object
$resolved: true
roleId: 1
roleName: "Admin"

undefined