模型更改后角度视图未更新

时间:2016-11-09 20:15:38

标签: javascript angularjs

我在AngularJS更新模型更改后的视图元素时出现问题。我有一个包含2个字段的表单,我希望用户填写其中1个,并让另一个自动填充(在ng-blur上)。我发布的示例使用人名和社会安全号码(SSN)。通过填写SSN,app会执行HTTP调用以获取该SSN的名称,反之亦然。

这是Angular指令:

define([
  'angular'
], function (angular) {
  angular.module('form.formDirective', [])
      .directive('formDirective', formDirective);

formDirective.$inject = ["$rootScope", "$sce", "$document", "$translate", "$filter", "$http"];

  function formDirective($rootScope, $sce, $document, $translate, $filter, $http) {

    var myLink = function ($scope, $element, attrs) {

        $scope.setFieldsForName = function(name) {
            var url = 'http://some.rest.api/getSsn/' + name;
            $http.get(url)
                .success(function(data, status, headers, config) {
                    $scope.personSsn = data.SSN;
                })
                .error(function (data, status, headers, config) {
                  // no-op
                });
        };

        $scope.setFieldsForSsn = function(ssn) {
            var url = 'http://some.rest.api/getName/' + ssn;
            $http.get(url)
                .success(function(data, status, headers, config) {
                    $scope.personSsn = data.name;
                })
                .error(function (data, status, headers, config) {
                  // no-op
                });
        };

    };

    return {
      templateUrl: 'form.directive.html',
      restrict   : 'EA',
      scope      : {
        field         : '=',
        model         : '=',
        renameChildKey: "=",
        preview       : "=",
        delete        : '&',
        ngDisabled    : "=",
        isEditData    : "="
      },
      replace    : true,
      link       : myLink
    };

  }
});

以下是相关的HTML:

<!-- Name -->
<div class="form-group">
    <input type="text"
       id="{{getId(0)}}"
       class="form-control"
       placeholder="Name"
       ng-model="personName"
       ng-blur="setFieldsForName(personName);"/>
</div>

<!-- SSN -->
<div class="form-group">
    <input type="text"
       id="{{getId(1)}}"
       class="form-control"
       placeholder="SSN"
       ng-model="personSsn"
       ng-blur="setFieldsForSsn(personSsn);"/>
</div>

这适用于一种情况,例如,填写姓名并获得SSN,或者相反。但是在第一个之后的任何尝试,发生的是调用函数,它获取数据,更新适当的范围变量,但输入字段值不反映变量的更新值。

我环顾四周,看到$ scope。$ apply()是一个流行的解决方案,然而,它对我不起作用,我得到一个错误,说明代码已经在digest()阶段,所以它无法运行apply()。

如果你知道发生了什么,我会感激任何帮助!

1 个答案:

答案 0 :(得分:0)

您应该使用 $ watch 作为范围方法,因为在模糊期间将触发事件。所以$ watch会查找任何更改绑定表达式,特别是每次更改。

sudo ln -s $(/usr/libexec/java_home)/jre/lib/server/libjvm.dylib /usr/local/lib

sudo R CMD javareconf

LD_LIBRARY_PATH=$(/usr/libexec/java_home)/jre/lib/server: open -a RStudio

install.packages("rJava",type='source')

install.packages("RWeka",type='source')

install.packages(c("NLP", "openNLP", "qdap"))

详细探索$ watch。 HERE