Javascript 访问指令中的范围属性,该属性通过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: {

我正在Ajax响应函数中为
$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…现在应该更容易理解了)