我对棱角还很陌生,并且对下面的事情感到困惑。

模板

  <div>
  <form novalidate>
     First Name:<br>
     <input type="text" ng-model="registrationdetails.firstName"><br>
     Last Name:<br>
     <input type="text" ng-model="registrationdetails.lastName"><br>
     Voucher Code:<br>
    <input type="text" ng-model="registrationdetails.voucherCode"><br>
    Country :<br>
    <input type="text" ng-model="registrationdetails.country"><br>

 <br><br>
<button ng-click="submit()">submit</button>




 

服务注册详细

    registrationDetails =
    angular.module('emailApp.registration.registrationdetails', []);

    registrationDetails.value('registrationdetails' , {

     firstName:'',
     lastName:'',
     voucherCode:'',
     country:'',
     email:'',
     password:''

   });


控制者

registrationstep1.js

myapp.controller('registrationStep1Controller' ,
function($scope,$state,$http,registrationdetails,registrationFactory){

 $scope.registrationdetails = registrationdetails;  ---> why it works here

$scope.submit = function(){

    //$scope.registrationdetails = registrationdetails; ---> why it does not works here

    firstName = registrationdetails.firstName;  ---> this contains firstName entered by user as I am expecting
    lastName = registrationdetails.lastName;
    voucherCode = registrationdetails.voucherCode;
    country = registrationdetails.country;

    console.debug(registrationdetails);
    data = {};
    data.firstName = firstName;
    data.lastName = lastName;
    data.voucherCode = voucherCode;
    data.country = country;

    registrationFactory.step1Store(data);


    $state.go('registration.step2');

    }

});


因此,$scope.registrationdetails = registrationdetails;实际表示注册细节是否是一项价值服务。

我对这段代码感到困惑。任何帮助将不胜感激。

谢谢

最佳答案

这是关于对象分配在JavaScript中如何工作的问题。该声明

$scope.registrationdetails = registrationdetails;


创建registrationdetails的所谓“浅表副本”。意味着我们正在处理指针。


  JavaScript为所有内容使用指针!这意味着您刚刚附加到$scope的对象实际上只是指向registrationdetails指向的同一对象的指针(是的,registrationdetails只是指向内存中某个对象的指针)。现在,无论何时更新这些对象之一的属性,实际对象(内存中的某个地方)都会更新,并且两个指针都将反映更改。


现在,这是您的工作代码正在做的(简化)演练:

用户在firstName输入字段中键入“ J”。

Angular说:“好吧,ng-model指令说要在当前作用域上更新名为firstName的对象的registrationdetails属性。嗯,就是这样,firstName的值当前是''(空字符串)。让我们在其中添加一个“ J”。”等等...


  记住指针!这里发生的是angular正在修改$scope.registrationdetails,这是指向registrationdetails指向的同一对象的指针。意思是angular正在更新两个对象(实际上只是两个变量都指向一个对象)。


调用submit()时,您可以访问registrationdetails对象上的所有更新属性,因为angular一直在更新用户键入的内容(通过更新$scope.registrationdetails)。

现在,这是非工作代码的作用:

用户在firstName输入字段中键入“ J”。

Angular说:“好的,在当前作用域中找到registrationdetails.firstName。糟糕!它不存在。让老板帮个忙,创建该对象,并在其上放置一个值为'J'的firstName属性。”等等...

现在,当调用submit()时,您的代码基本上是在说:“嘿,棱角分明,我知道您为构建该对象付出了巨大的努力,以至于我忘了戴上$scope

$scope.registrationdetails = registrationdetails;


我将为这个新对象分配registrationdetails,我在前一阵子注入了这个对象,它充满了空字符串。抱歉,我想您流汗并奴役过的物体只是垃圾收集器的食物。”


  还记得指针吗?是的,在registrationdetails上创建的$scope指针所指向的对象与您注入到控制器中的registrationdetails所指向的对象不同。该赋值语句将覆盖angular创建的对象。


现在,当您访问firstNamelastName等时,您会在registrationdetails一直指向的对象上得到空字符串。

希望这有助于清理问题。干杯。

07-24 19:27