Angular ng-bind 不访问作用域变量
Angular ng-bind not accessing scope variables
ng-bind 没有访问 $scope 变量。当视图加载时,数据未呈现 - 它只是空白,但我可以在控制台 $scope 的 "showTopic" 变量下看到我需要访问的所有数据。有什么地方出错了吗?
当我关注从 dashboard.html 到 topic.html 的更改视图时,主题视图出现问题。两个视图都使用相同的控制器。
dashboard.html
<div ng-controller="topicsController">
<h2>DASHBOARD</h2>
<button class="btn btn-danger" ng-click='getCookies()'>Cookies</button>
<div class="col-sm-8 col-sm-offset-2">
<table class="table table-striped">
<thead>
<th>Category</th>
<th>Topic</th>
<th>Poster's Name</th>
<th>Posts</th>
</thead>
<tbody>
<tr ng-repeat="topic in topics track by $index">
<td> <a href="" ng-click='showTopic(topic._id, $index)'> {{topic.category}} </a></td>
<td> {{topic.topic}} </td>
<td> {{topic.user}} </td>
<td> {{topic.posts}} </td>
</tr>
</tbody>
</table>
</div>
topic.html
<div ng-controller="topicsController">
<div class="col-sm-10 col-sm-offset-1">
<h3><a href="">{{topicData.user}}</a> posted a topic:</h3>
<p>Desciption: {{ topicData.description }}</p>
<h4>Post your answer here...</h4>
</div>
topicsController.js
console.log("topicsController loaded");
app.controller('topicsController', ['$scope','topicFactory', '$location', '$cookies', function($scope, topicFactory, $location, $cookies) {
var index = function(){
topicFactory.index(function(returnedData){
$scope.topics = returnedData;
});
};
index();
$scope.add = function(){
var user = $cookies.get('user');
$scope.addTopic.user = user
topicFactory.add($scope.addTopic, function(returnedData){
index();
})
}
$scope.showTopic = function(id, $idx){
topicFactory.show(id, function(returnedData){
$scope.topicData = returnedData.data[0];
})
$location.url('/topic/' + $idx);
}
}]);
topicFactory.js
console.log("topicFactory loaded");
app.factory('topicFactory', ['$http', function($http) {
// The factory is nothing more than a function that returns an object
function topicFactory(){
var _this = this;
this.index = function(callback){
console.log("index topicsFactory");
$http.get('/topics').then(function(returned_data){
topics = returned_data.data;
console.log(topics);
callback(topics)
})
}
this.add = function(newTopic, callback){
console.log(newTopic);
$http.post('/topics', newTopic).then(function(returned_data){
console.log("posted");
callback(returned_data);
})
}
this.show = function(id, callback){
console.log("show factory");
$http.get('/topics/' + id).then(function(returned_data){
console.log("got show data");
callback(returned_data);
})
}
}
return new topicFactory();
}]);
以及我可以在控制台范围内的 showTopic 变量中查看的数据:
showTopic:Object
__v:0
_id:"57eca48afd30cea088ffdf2f"
category:"JavaScript"
date:"2016-09-29T05:20:10.878Z"
day:28
description:"Test 6"
month:9
topic:"Test 6"
user:"Test"
year:2016
问题的发生是因为您的视图更改。当您更改视图时,范围也会更改。该范围存在于您的 dashboard
视图中,具有正确的范围变量,但在 topic
视图中实际上是空的。我知道它看起来是骗人的,因为您正在记录对象。因此,如果您正在更改视图并希望使用来自另一个 view/controller 的范围变量,您将希望将对象保存在服务中,然后在控制器中 return 该对象,将对象字段分配给您的范围变量并以这种方式显示它,这就是您正在做的,但是您对两个不同的视图使用相同的控制器。一旦加载第二个,它就变成空的,没有任何显示。
我建议做的是创建两个不同的控制器。第一个捕获你需要的主题,传递给服务并存储它们,然后在新的控制器中调用它们,它们就会显示出来。两种不同的视图,两种不同的控制器,一种访问信息的服务。
我强烈建议查看 this post 并了解如何在 Angular 中的路由之间传递作用域以及视图如何影响作用域。
ng-bind 没有访问 $scope 变量。当视图加载时,数据未呈现 - 它只是空白,但我可以在控制台 $scope 的 "showTopic" 变量下看到我需要访问的所有数据。有什么地方出错了吗?
当我关注从 dashboard.html 到 topic.html 的更改视图时,主题视图出现问题。两个视图都使用相同的控制器。
dashboard.html
<div ng-controller="topicsController">
<h2>DASHBOARD</h2>
<button class="btn btn-danger" ng-click='getCookies()'>Cookies</button>
<div class="col-sm-8 col-sm-offset-2">
<table class="table table-striped">
<thead>
<th>Category</th>
<th>Topic</th>
<th>Poster's Name</th>
<th>Posts</th>
</thead>
<tbody>
<tr ng-repeat="topic in topics track by $index">
<td> <a href="" ng-click='showTopic(topic._id, $index)'> {{topic.category}} </a></td>
<td> {{topic.topic}} </td>
<td> {{topic.user}} </td>
<td> {{topic.posts}} </td>
</tr>
</tbody>
</table>
</div>
topic.html
<div ng-controller="topicsController">
<div class="col-sm-10 col-sm-offset-1">
<h3><a href="">{{topicData.user}}</a> posted a topic:</h3>
<p>Desciption: {{ topicData.description }}</p>
<h4>Post your answer here...</h4>
</div>
topicsController.js
console.log("topicsController loaded");
app.controller('topicsController', ['$scope','topicFactory', '$location', '$cookies', function($scope, topicFactory, $location, $cookies) {
var index = function(){
topicFactory.index(function(returnedData){
$scope.topics = returnedData;
});
};
index();
$scope.add = function(){
var user = $cookies.get('user');
$scope.addTopic.user = user
topicFactory.add($scope.addTopic, function(returnedData){
index();
})
}
$scope.showTopic = function(id, $idx){
topicFactory.show(id, function(returnedData){
$scope.topicData = returnedData.data[0];
})
$location.url('/topic/' + $idx);
}
}]);
topicFactory.js
console.log("topicFactory loaded");
app.factory('topicFactory', ['$http', function($http) {
// The factory is nothing more than a function that returns an object
function topicFactory(){
var _this = this;
this.index = function(callback){
console.log("index topicsFactory");
$http.get('/topics').then(function(returned_data){
topics = returned_data.data;
console.log(topics);
callback(topics)
})
}
this.add = function(newTopic, callback){
console.log(newTopic);
$http.post('/topics', newTopic).then(function(returned_data){
console.log("posted");
callback(returned_data);
})
}
this.show = function(id, callback){
console.log("show factory");
$http.get('/topics/' + id).then(function(returned_data){
console.log("got show data");
callback(returned_data);
})
}
}
return new topicFactory();
}]);
以及我可以在控制台范围内的 showTopic 变量中查看的数据:
showTopic:Object
__v:0
_id:"57eca48afd30cea088ffdf2f"
category:"JavaScript"
date:"2016-09-29T05:20:10.878Z"
day:28
description:"Test 6"
month:9
topic:"Test 6"
user:"Test"
year:2016
问题的发生是因为您的视图更改。当您更改视图时,范围也会更改。该范围存在于您的 dashboard
视图中,具有正确的范围变量,但在 topic
视图中实际上是空的。我知道它看起来是骗人的,因为您正在记录对象。因此,如果您正在更改视图并希望使用来自另一个 view/controller 的范围变量,您将希望将对象保存在服务中,然后在控制器中 return 该对象,将对象字段分配给您的范围变量并以这种方式显示它,这就是您正在做的,但是您对两个不同的视图使用相同的控制器。一旦加载第二个,它就变成空的,没有任何显示。
我建议做的是创建两个不同的控制器。第一个捕获你需要的主题,传递给服务并存储它们,然后在新的控制器中调用它们,它们就会显示出来。两种不同的视图,两种不同的控制器,一种访问信息的服务。
我强烈建议查看 this post 并了解如何在 Angular 中的路由之间传递作用域以及视图如何影响作用域。