Angularjs:指令看到它的范围,但是它不能在其中取一个变量

时间:2016-05-27 06:39:24

标签: angularjs angular-promise angular-directive

由于指令的奇怪行为,我变得疯狂。它是一个非常标准的,它获取从DB提供的参数。当然,来自DB的数据是使用promise的令牌:

//opening of directive and definition of controller
   return {
        restrict: 'EA',
        scope: {
            dateFromPromise: '=',  //a Date() object
            timeFromPromise: '=',  //a Date() object
            booleanFromPromise '='
        },
        templateUrl: 'abc/abc.html',
        controller: AController,
        controllerAs: 'aController'
    };
 //closing of directive

现在,即使两者都来自同一个承诺,也看不到一些变量。

如果我尝试打印$ scope.booleanFromPromise它很好,但是我无法打印$ scope.dateFromPromise和$ scope.timeFromPromise(undefined)。也许是因为它需要更多的时间来创造?

如果我使用F12运行浏览器,我会在控制台中看到以下作为console.log($ scope)的结果;如我所愿,一切都是明确和正确的:

$scope:
n {
    ...
    booleanFromPromise: true
    dateFromPromise: Date {Tue May 24 2016 10:12:00 GMT+0200 (Central European Standard Time)}
    timeFromPromise: Date {Tue May 24 2016 10:12:00 GMT+0200 (Central European Standard Time)}
}

因此日期存在并且正确,至少 我用控制台以这种非逻辑语言js打印。

如何做到:

  1. 获取所有来自承诺的数据
  2. 步骤1完成后,将数据传递给带有指令的标记,这将看到所有内容。
  3. 了解指令为什么在其自己的范围内查看所有变量,但它无法在其中包含单个日期,即使已设置。
  4. 由于

1 个答案:

答案 0 :(得分:1)

你可以做几件事。

首先,在@Jacky Coogan建议的指令中使用手表,这样你就可以看到模特何时发生变化。

其次,你说你从承诺中获得了所有数据,所以你可以这样做:

res.$promise.then(function (data) {
                deffered.resolve(data);
                $scope.dataLoaded = true;
            });

然后在你的html中,你正在使用你的指令,把这样的东西放在

<div ng-if="dataLoaded">
   <your-directive booleanFromPromise="xxx" dateFromPromise="yyy" timeFromPromise="zzz" ></your-directive>
</div>
通过这种方式,您将能够确保使用已加载的数据初始化您的指令。

或者,而不是上面的方法,您可以使用“controllerResolver”,以确保在初始化控制器时加载数据,然后您将不需要$scope.dataLoaded 。例如:

app.factory("someControllerResolver", ["someService",function (someService) {

       return {
            resolve: function () {
                var deferred = $q.defer();

                someService.getSomething({}, function (res) {                        
                    deferred.resolve(res.data);
                });

                return deferred.promise;
            }
        };

        return {
            resolve: resolve
        };

    }]);

    app.controller("someController", ["dataContext",function (dataContext) {
        $scope.yourData = dataContext;
    ...

尝试上述方法之一,然后您的指令应正确加载数据。

如果不是,那么深入研究从服务器返回的内容。如果从服务器返回的数据是正常的,那么您可能会错误地将值传递给指令。

希望这会有所帮助。