我正在建立一个测验,在主页上我允许人们输入他们的名字,所以它一直显示在屏幕上。我认为价值服务是最好的。
MainCtrl:
angular
.module('myQuiz')
.controller('MainController', ["CONSTANTS", 'User', MainController]);
function MainController(CONSTANTS, User) {
vm = this;
vm.title = CONSTANTS.TITLE;
vm.user = User.name;
};
values.js
angular
.module('myQuiz')
.value("User", {
name: "John Doe"
});
HomeCtrl是mainctrl的孩子:
angular
.module('myQuiz')
.controller('HomeController', ['$scope', '$location', 'User', HomeController]);
function HomeController($scope, $location, User) {
$scope.test = "Enter your name to start the quiz";
$scope.user;
function startQuiz (name) {
setUserName(name);
return $location.path('/quiz');
}
function setUserName(name) {
User.name = name;
console.log(User.name);
}
$scope.startQuiz = startQuiz;
};
在mainctrl中显示John Doe,但是当我控制台登录时,它会显示正确的输入。为什么不更新?
答案 0 :(得分:1)
将vm.user = User.name;
更改为vm.user = User
;
这是因为您尝试绑定到基本数据类型(String)。您需要绑定到对象。以下是关于原因的非常好的解释:
范围继承通常很简单,你甚至不需要知道它正在发生......直到你尝试双向数据绑定(即表单元素,ng-model)到一个原语(例如,数字) ,string,boolean)在子范围内从父范围定义。它不像大多数人期望的那样工作。会发生什么是子范围获取其自己的属性,该属性隐藏/隐藏同名的父属性。这不是AngularJS正在做的事情 - 这就是JavaScript原型继承的工作方式。
来源:https://github.com/angular/angular.js/wiki/Understanding-Scopes。
以下是另一篇可能更容易理解的文章:http://www.codelord.net/2014/05/10/understanding-angulars-magic-dont-bind-to-primitives/