【问题标题】:Angular directive isolate scope to parent binding undefinedAngular 指令将范围隔离到父绑定未定义
【发布时间】:2015-05-14 23:45:40
【问题描述】:

我正在使用(很棒的)Restangular,我遇到了一些迫使我使用scope.$parent(不是很棒)的东西,我不想使用它。似乎即使我的控制器是我的指令范围的父范围,= 隔离范围绑定也会在我的父控制器执行之前进行评估。

使用以下 HTML:

<div ng-controller="myController">
    <div x-my-directive x-some-value="parentValue"></div>
</div>

还有以下指令:

myApp.directive("myDirective", function () {
    return {
        restrict: 'A',
        link: function (scope, elem) {
            console.log(scope.someValue); // Logs 'undefined' :(
        },
        scope: {
            someValue: "="
        }
    }
});

还有以下控制器:

myApp.controller("myController", function($scope, allMyValues) {
    allMyValues.getList().then(function(parentValue){
        $scope.parentValue = parentValue;
    });
}

如我的指令link 函数所示,评估一个应该绑定到我父级范围属性的范围属性会返回undefined。但是,当我将指令 link 函数更改为以下内容时:

    myApp.directive("myDirective", function () {
        return {
            restrict: 'A',
            link: function (scope, elem) {
               setTimeout(function() {
                  console.log(scope.someValue); // Logs '{1: number_1, 2: number_2}'
                }, 2000);
            },
            scope: {
                someValue: "="
            }
        }
    });

我该如何解决这个问题??

谢谢

【问题讨论】:

  • 对我来说似乎工作正常,请看这里jsbin.com/komikitado/1/edit你如何在 $scope.parentValue 中设置值?
  • @sylwester 抱歉,我刚刚修改了问题:我在控制器中使用了 Restangular(我知道一开始就不添加它是愚蠢的)

标签: javascript angularjs angularjs-directive restangular


【解决方案1】:

这应该会有所帮助:

myApp.controller("myController", function($scope, allMyValues) {
//add this line
$scope.parentValue={};

    allMyValues.getList().then(function(parentValue){
        $scope.parentValue = parentValue;
    });
}

$scope.parentValue 在您的请求得到解决之前不存在,因此在您的代码中添加如下所示的行 示例演示http://jsbin.com/komikitado/1/edit

【讨论】:

  • 这解决了我的问题,剩下要做的就是$scope.$apply()。谢谢!
【解决方案2】:

在将值分配给范围之前,您似乎正在等待解决承诺。

有几种方法可以解决这个问题。

一种方法是尝试将 Restangular 调用移动到包含控制器的视图的解析函数。然后,您可以直接作为控制器中的注入访问解析的数据

另一种方法可能是将承诺直接分配给范围,然后在链接函数中等待解决。

scope.someValue.then(function(value) { console.log(value); });

【讨论】:

  • 即使它现在可以工作,但您的解决方案似乎更专业。我去看看,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
相关资源
最近更新 更多