由于指令的奇怪行为,我变得疯狂。它是一个非常标准的,它获取从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打印。
如何做到:
由于
答案 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;
...
尝试上述方法之一,然后您的指令应正确加载数据。
如果不是,那么深入研究从服务器返回的内容。如果从服务器返回的数据是正常的,那么您可能会错误地将值传递给指令。
希望这会有所帮助。