알아낼 수없는 이상한 상황이 있습니다.
Angular 1.4에서는 양식 데이터를 수집하기위한 모델로 사용되는 범위 개체에 변수가 $scope.videoModel
있습니다. 양식이 제출되면 모델이 함수로 전달되어 ng-submit="createVideo(videoModel)
처리 및 정규식이 발생합니다. 예를 들어 YouTube ID를 추출합니다.
모든 것이 의도 한대로 작동하지만 범위 개체를 인수 ( payload
)로 함수에 전달하더라도 인수에서 업데이트되는 특정 속성도 $scope
.
내가 전달하는 경우 eample를 들어, $scope.videoModel.youtube
로 createVideo
등 payload
, 다음 유튜브 ID를 추출하고 같은 지정 payload.youtube = payload.youtube.match(regEx);
의 $scope.videoModel.youtube
속성도 업데이트됩니다. 양식 값이 완전한 URL에서 ID로만 변경되기 때문에 이것을 볼 수 있습니다.
videoModel
함수에 인수로 전달 하면 변수에 대한 복사본이 생성되지 않고 대신 참조되는 것 같습니다. 나는 그것에 대해 아무것도 찾을 수없는 것 같습니다. 나는 단순히 이와 같은 새로운 변수를 만들 수 있다고 생각 var tempVar = payload
하지만 엉뚱한 것처럼 보이고 근본적으로 잘못된 일을하고 있는지 궁금합니다.
videoModel은 사본이 아닌 참조로 전달됩니까?
다음은 간결함을 위해 잘린 코드 샘플입니다.
HTML
<div class="form-group">
<label for="inputPassword3" class="col-sm-2 control-label">YouTube Url</label>
<div class="col-sm-10">
<input class="form-control" ng-class="{ 'has-error' : newvideo.youtube.$invalid && newvideo.youtube.$touched, 'is-valid': newvideo.youtube.$valid }" placeholder="Youtube Url" ng-model="videoModel.youtube" name="youtube" ng-pattern="youtubeValidateRegex" required>
<div class="help-block" ng-messages="newvideo.youtube.$error" ng-show="newvideo.youtube.$touched">
<p ng-message="required">YouTube Url is required.</p>
<p ng-message="pattern">Please input a valid YouTube Url.</p>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10" ng-if="!success">
<button class="btn btn-default" ng-click="newVideo(videoModel)" ng-disabled="newvideo.$invalid"> Publish</button>
</div>
</div>
JS
$scope.videoModel = {
youtube: 'https://www.youtube.com/watch?v=VkzVgiYUEIM',
vimeo: 'https://vimeo.com/193391290'
};
$scope.newVideo = function(payload) {
$scope.processing = true;
payload.user = $scope.user._id;
payload.filename = $scope.filename;
console.log(payload);
if(payload.type === 'vimeo') {
var matchVM = payload.vimeo.match($scope.vimeoExtractRegex);
console.log(matchVM);
if(matchVM) { //todo: helpers
payload.vimeo = matchVM[5];
} else {
return toastr.error('Unable to extract Vimeo ID');
}
}
if(payload.type === 'youtube') {
var matchYT = payload.youtube.match($scope.youtubeExtractRegex);
if (matchYT && matchYT[1].length === 11) { //todo: helpers
payload.youtube = matchYT[1];
} else {
return toastr.error('Unable to extract YouTube ID');
}
}
Videos.newVideo(payload)
.then(function(result) {
toastr.success('New video created.');
$scope.processing = false;
$scope.success = true;
$scope.result = result.data.result;
$scope.payload = result.data.payload; //I do assign part of the result to $scope.payload... but that still doesn't explain videoModel.youtube getting overwritten.
})
.catch(function(response) {
$scope.error = true;
toastr.error(response.data.message, response.data.status);
});
return $scope.success;
};
JavaScript에서 객체 참조는 값입니다.
이 때문에 객체는 참조로 전달되는 것처럼 동작합니다.
함수가 객체 속성을 변경하면 원래 값이 변경됩니다.
객체 속성에 대한 변경 사항은 함수 외부에서 볼 수 있습니다 (반영).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다