Javascript 为什么下面的$scope在此函数中变为空?

Javascript 为什么下面的$scope在此函数中变为空?,javascript,angularjs,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&g

为什么
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>
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}}
你说你在一个
ng repeat
中得到了这个逻辑。我想这是你的问题

angular对
ng重复的每次“写入”所做的是创建一个新的
范围
。因此,您的
ng model=“panodataName”
将名为
panodataName
的属性绑定到循环特定迭代的本地范围,而不是全局控制器范围

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

我相信您想要的是绑定到
ng repeat
的父范围。这是您实际定义
panodataName
属性的地方,也是您试图记录的内容

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

ng-model="$parent.panodataName"
$parent
是指向
ng repeats
父范围的特定循环范围的全局变量

希望这是有意义的,我添加了一个小提琴演示

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


编辑:增加了证据


这表明
ng repeat
创建了新的作用域


另外,谷歌搜索了一点,找到了一个答案,其中的注释描述了为什么避开
$parent

是一个好主意。您没有在$scope.addPanodata函数的$scope.panodataName中添加任何值。添加后,只有值不会被定义。您对
$scope.panodataName
addPanodata()
中,除了在控制台中显示它之外。我以为`ng model=“panodataName”`应该为
$scope.panodataName?
中的某个地方添加一个值:
`$scope.addPano=function(){var Pano=AV.Object.extend('Panorama'),Pano=new Pano()var json={'name':$scope.panoName,'buildingCode':$scope.buildingId`并且正在
$scope.addPano
中检索该值。请提供整个html文件。也许您可以使用Plunker()为此目的。
ng repeat
创建新的作用域,但这些作用域继承自其父作用域。
ng model
如果名称中有一个“点”,则可以正常工作。此外,您还可以从
ng repeat
使用
ng model=“ref.panodataNameList[$index]“
@georgeawg你说得对,我忘了,我想这就是为什么allot的人不喜欢直接绑定作用域,而是绑定子属性。
ng-model="$parent.panodataName"