带有$resource和自定义格式化程序/解析器指令的AngularJS不起作用

带有$resource和自定义格式化程序/解析器指令的AngularJS不起作用,angularjs,Angularjs,下面是一个例子: HTML: <p>Hello {{data | json}}!</p> <div> <textarea myconverter ng-model="data"></textarea> </div> 简单的Hello部分工作正常,当AJAX调用返回时,将使用正确的数据进行更新。但是文本区域从未更新过。如果我设置了一个断点,看起来它是一个没有数据的对象,但是我可以看到$resource方法。如果我将te

下面是一个例子:

HTML:

<p>Hello {{data | json}}!</p>

<div>
  <textarea myconverter ng-model="data"></textarea>
</div>

简单的Hello部分工作正常,当AJAX调用返回时,将使用正确的数据进行更新。但是文本区域从未更新过。如果我设置了一个断点,看起来它是一个没有数据的对象,但是我可以看到$resource方法。如果我将textarea更改为指向数据对象的字段,它将按预期工作。

此问题与您的指令无关。在控制器中,将$resource的使用替换为使用$http服务的内容,如下所示:控制器依赖项中显然包含$http:

$scope.data = $http({
    url:'some-data.json',
    method:"GET"
  }).then(function(result) {
    $scope.data = result.data;  
  });
无论出于何种原因,当$resource将调用结果分配给作用域上的“data”时,不会触发任何监视,因此当$resource完成时,textarea的模型不会更新,因此最初$scope.data为空且{}显示在文本区域中,会进行$resource调用,并更新$scope.data,但是,textarea手表不起作用。使用$http服务并手动将调用结果分配给$scope.data确实有效,并触发相应的$watch

您可以通过添加

$scope.$watch('data',function() {....}); 

在控制器的某个地方,当使用$resource时,您将看到手表最初只调用一次。$resource调用完成后,$watch永远不会被触发。

我遇到了同样的问题,至少在最新的Angular中找到了一个

正如正确提到的,ngModel监视程序不会触发。这是。为了防止这种情况发生,我复制并稍微修改了后来的源代码。现在我们有了一个新的指令,可以插入到具有$resource的ngModels。稍后,我可能会更新它,以具有可配置的挂起消息/指令和适当的优先级设置

app.directive('isResourceModel', function() {
  return {
  restrict: 'A',
  require: 'ngModel',

  link: function(scope, element, attr, ctrl) {
            ctrl.$formatters.push(function resourceFormatter(value){
              if (value.$promise != null && value.$resolved === false){
                value.$promise.then(function (data){
                  var viewValue = data, 
                    idx = ctrl.$formatters.length,
                    runFormatter = false;

                  while(idx--){
                    formatter = ctrl.$formatters[idx];
                    if (runFormatter
                        || (runFormatter = formatter === resourceFormatter))
                        viewValue = formatter(viewValue)
                  }
                  ctrl.$viewValue = viewValue;
                  ctrl.$render();
                  if (ctrl.$validators.length > 0)
                    ctrl.$validate();
                  });  
              }
              return value;
            });
        }
    };
});
编辑:我对答案做了一个修改。您可以将其与bower一起使用,如下所示:

bower install https://github.com/P-Seebauer/ng-isFutureModel.git

我希望我能更多地了解为什么更新没有发生,但这解决了我的问题。这真的不是一个修复方法-angular提供$resource专门用于轻松处理各种不同的$http调用。我现在遇到了这个问题,我不想去掉$resource,因为我必须重写应用程序的一部分,只是为了自己重新发明$resource。所以问题是:为什么我们不能使用$resource和一个指令?
bower install https://github.com/P-Seebauer/ng-isFutureModel.git