Javascript 访问指令中的范围属性,该属性通过Ajax设置
我正在Ajax响应函数中为Javascript 访问指令中的范围属性,该属性通过Ajax设置,javascript,angularjs,ajax,web,frontend,Javascript,Angularjs,Ajax,Web,Frontend,我正在Ajax响应函数中为$scope设置一个值 $http.post('/aUrl', someData) .then(function(response) { $scope.value = response.data; }); 这意味着在回调运行之前,它是未定义的 我想在自定义指令中使用此值,如下所示: myModule.directive('myDirective', function() { return { scope: {
$scope
设置一个值
$http.post('/aUrl', someData)
.then(function(response) {
$scope.value = response.data;
});
这意味着在回调运行之前,它是未定义的
我想在自定义指令中使用此值,如下所示:
myModule.directive('myDirective', function() {
return {
scope: {
value: '='
},
link: function(scope, element, attributes) {
// do stuff with scope.value...
}
};
});
在模板中:
<div my-directive value="value"></div>
但是,当link函数运行时,该值仍然是未定义的
处理此问题的正确方法是什么?您可以查看值的变化:
attributes.$observe('value', function (val) {
if (val) {
}
});
实现这一点的最安全解决方案是在服务中共享数据。我创建了一个plunker来演示
myAppModule.factory("pollingService", function ($http, $timeout, $q) {
var svc = this;
svc.data = { resp: {}, count: 0};
svc.count = 0;
svc.poller = function() {
svc.count++;
return $http.get('data.json').then(function(r) {
svc.data.count=svc.count;
//console.log(data);
$timeout(svc.poller, 4500);
});
};
return svc;
});
然而,有很多方法可以完成您想要做的事情,我强烈建议您在使用Angular时遵循本指南。它将保持您的代码干净,并且可以轻松地移植到Angular 2。
你不能在指令中调用ajax吗?如果我用plunker解释一下会有帮助吗?@PatrickLawler可能会,谢谢:)目前正在使用一个,只是复制了你的用例:如果你想要一个依赖于你的指令是你的父控制器的兄弟的解决方案,我建议我们使用服务,或者像Aviv建议的那样观察属性。如果您的指令可以定位为父控制器的子控制器,那么此方法实际上可以正常工作,并且您无需更改任何内容,您的指令的范围将与其父控制器的范围共享。我将尝试此方法。顺便问一下,如果属性中已经有值,为什么我要将值放在范围中呢?$observe调用的“值”代表$scope.value(我以前在那里摆脱了那个讨厌的承诺…从另一个沙箱借用了原来的plunker…现在应该更容易理解了)