为什么以下$ scope在此函数中变为空白?

时间:2016-01-11 07:25:35

标签: javascript angularjs

panodataName函数中为什么$scope.addPanodata变空?

HTML:

<input type="text" class="form-control" ng-model="panodataName" style="width:auto;padding:0;">
<a class="btn btn-primary" href="javascript:;" ng-click="addPanodata(pano.objectId)">Add</a>

JS:

angular.module('yoApp')
  .controller('addPanoCtrl', function($q, $scope, $rootScope, $routeParams, serviceUpload) {
    $scope.panodataName = ''

    $scope.addPanodata = function(panoId) {
      var Panodata = AV.Object.extend('PanoramaData'),
      panodata = new Panodata(),
      panoJSON = _.where($scope.building.pano, {'objectId': panoId})

      $scope.pano = panoJSON[0]
      console.log($scope.panodataName)
      console.log($scope.panodataName)

      panodata.save(json, {
      success: function(object) {

      },
      error: function(object, error) {

      }
      })
    }

我发现它很奇怪,因为如果我这样做:     

{{panodataName}}
    

panodataName正确显示input的值。

修改

也许是因为它在ng-repeat内?

<div class="col-md-6" ng-repeat="panodata in pano.panoData">

1 个答案:

答案 0 :(得分:2)

你说你在ng-repeat内得到了这个逻辑。我怀疑那是你的问题。

对于每个&#39; itteration&#39; ng-repeat的{​​{1}}创建一个新的scope。因此,ng-model="panodataName"将一个名为panodataName的属性绑定到该循环的特定迭代的本地范围,而不是绑定到全局控制器范围。

此外,如果您在ng-repeat中添加{{panodataName}},那么它将起作用并打印输入文本,因为它与ng-repeat的子范围绑定。

我相信你想要的是绑定到ng-repeat的父范围。这是您实际定义panodataName属性以及尝试记录的内容。

为此,您还需要更改ng模型:

ng-model="$parent.panodataName"

$parent是特定循环itteration范围的全局变量,指向ng-repeats父范围。

希望这是有道理的,我添加了一个小提琴演示。

注意:此实现有一个缺点,因为如果更新ng-repeat中的所有其他输入,则每个输入现在都绑定到同一个变量。

https://jsfiddle.net/j4txmzhe/

编辑:添加证据,

这表明ng-repeat创建了新的范围directives-that-create-scopes

此外,谷歌会提出this SO答案,其中的评论描述了为什么避免$parent转向的好主意。