我对棱角还很陌生,并且对下面的事情感到困惑。
模板
<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创建的对象。现在,当您访问
firstName
,lastName
等时,您会在registrationdetails
一直指向的对象上得到空字符串。希望这有助于清理问题。干杯。