我有一个表单,用户将在其中输入名称,然后单击“下一步”。我想做的是,当用户单击“下一步”时,我想在alert函数中$scope.name更新的toChat值,但是会警告初始值,即James。如何在角度函数中访问更新的值?我在理解AngularJs中的共享变量时遇到了一些严重的问题。

js

.controller('NewcontactCtrl', function($scope,$rootScope, $ionicHistory,$window) {

     $scope.name='James';
     $scope.myGoBack = function() {
        $ionicHistory.goBack();
      };
     $scope.toChat = function() {
         alert($scope.name);

     };
 })


html

<ion-view view-title="New contact">
    <ion-nav-back-button>
    </ion-nav-back-button>

     <ion-nav-buttons side="primary">
      <button class="button" ng-click="myGoBack()">
       Cancel
      </button>
    </ion-nav-buttons>

     <ion-nav-buttons side="secondary">
      <button class="button" ng-click="toChat()" >
       Next
      </button>
    </ion-nav-buttons>

    <ion-content scroll="false" has-header="false" padding="true" >

        <div class="list">
            <label class="item item-input">
                <input type="text" placeholder="Name" ng-model="name" />
            </label>
            <label class="item item-input">
                <textarea placeholder="Notes" ng-model="notes" rows="10"></textarea>
            </label>
        </div>
</ion-content>
</ion-view>


有人可以帮忙吗?

最佳答案

请参阅:https://github.com/angular/angular.js/wiki/Understanding-Scopes

上面最相关的部分:


  范围继承通常是简单明了的,并且您通常甚至不需要知道它正在发生...直到您尝试将2路数据绑定(即,表单元素,ng-model)绑定到基元(例如,数字,字符串,布尔值)从子作用域内部在父作用域上定义。它不能像大多数人期望的那样工作。发生的情况是子作用域获得了自己的属性,该属性隐藏/阴影了同名的父属性。 AngularJS并没有这样做-这就是JavaScript原型继承的工作方式。新的AngularJS开发人员通常不会意识到ng-repeat,ng-switch,ng-view和ng-include都会创建新的子范围,因此当涉及这些指令时,常常会出现问题。 ...
  
  通过遵循always have a '.' in your ng-models的“最佳实践”,可以轻松避免原语出现此问题-观看3分钟。 Misko演示了ng-switch的原始绑定问题。
  
  有一个 '。'在您的模型中,将确保原型继承在起作用。所以用
  <input type="text" ng-model="someObj.prop1">而不是
  <input type="text" ng-model="prop1">


我相信您在某处(可能是离子含量)有一个指令,该指令在输入字段所在的位置创建一个新范围,并与“下一步”按钮所在的范围分开。

为了模拟这一点,我在下面的代码段中使用了ng-repeat(但是我只重复了一次),这会导致分割范围的行为相同。如果要使用未经修改的html控制器代码,则会重现您遇到的问题。

解决此问题的方法是在绑定时“使用点(。)”。注意,我已经将名称包装在作用域上名为“ data”的对象中,因此现在您将其称为data.name而不是name



(function() {
  'use strict';

  angular.module('myApp', [])
    .controller('NewcontactCtrl', function($scope, $window) {

    $scope.repeaterTest = [1];
      $scope.data = {name: 'James'};
      $scope.toChat = function() {
        $window.alert($scope.data.name);
      };
    });

})();

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.28/angular.min.js"></script>

<div ng-app="myApp">
  <div ng-controller="NewcontactCtrl">
    <label ng-repeat="test in repeaterTest">
      <input type="text" placeholder="Name" ng-model="data.name" />
    </label>
    <button class="button" ng-click="toChat()">
      Next
    </button>
  </div>

</div>

关于javascript - Angular 数据绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30126743/

10-13 01:20