AngularJS 使用 ng-view 时数组未更新
AngularJS array not updating when using ng-view
我正在学习如何使用 ngRoute 将我的 html 表单拆分为单独的视图。当我将数据添加到 index.html 中的主数组时,数组会正确更新,但是当我在通过 ng-view 添加的 html 表单中尝试相同的方法时,数组会无法正确呈现。我可以调试并看到数组正在添加新名称,但它不会在 html.
上呈现
Index.html
<h1> Names </h1>
<ul ng-repeat="name in names">
<li>{{name.fname}}</li>
</ul>
<h1>Add name in index.html</h1>
<input type="text" ng-model="name" />
<button ng-click="addName(name)">add name</button>
<ul>
<li><a href="#/first"> First</a></li>
<li><a href="#/second"> Second</a></li>
</ul>
<div class="container">
<div ng-view></div>
</div>
Apps.js
var myApp = angular.module('myApp', ['ngRoute']);
myApp.config(function ($routeProvider) {
$routeProvider
.when('/first', {
templateUrl: 'pages/first.html',
controller: 'mainController'
})
.when('/second', {
templateUrl: 'pages/second.html',
controller: 'mainController'
})
});
myApp.controller('mainController', ['$scope', '$log', function($scope, $log) {
$scope.names = [{fname:'john',lname:'doe'},{fname:'jane',lname:'doe'}];
$scope.addName = function(name){
$scope.names.push({fname:name,lname:'no last name'});
}
}]);
first 和 second.html 相同
<h1>Add name in first.html</h1>
<input type="text" ng-model="name" />
<button ng-click="addName(name)">add name</button>
这是设计使然。
$scope
仅限于控制器的范围,即在 ng-view
内呈现的所有内容。这意味着有两个名为 names
的集合,一个在应用程序范围内,一个在控制器范围内。当您修改控制器内的 names
集合时,它只会修改此集合,而不是应用程序根级别中引用的集合。 (我假设你将 mainController
绑定到 body 标签,否则 index.html 中的 addName() 将不起作用。这本身不是一个很好的选择,你不应该将另一个控制器实例放入本身,除非你绝对知道你在做什么。)
处理这种情况的正确方法是将 names
集合和 addName() 函数放入您注入控制器的服务中。
我正在学习如何使用 ngRoute 将我的 html 表单拆分为单独的视图。当我将数据添加到 index.html 中的主数组时,数组会正确更新,但是当我在通过 ng-view 添加的 html 表单中尝试相同的方法时,数组会无法正确呈现。我可以调试并看到数组正在添加新名称,但它不会在 html.
上呈现Index.html
<h1> Names </h1>
<ul ng-repeat="name in names">
<li>{{name.fname}}</li>
</ul>
<h1>Add name in index.html</h1>
<input type="text" ng-model="name" />
<button ng-click="addName(name)">add name</button>
<ul>
<li><a href="#/first"> First</a></li>
<li><a href="#/second"> Second</a></li>
</ul>
<div class="container">
<div ng-view></div>
</div>
Apps.js
var myApp = angular.module('myApp', ['ngRoute']);
myApp.config(function ($routeProvider) {
$routeProvider
.when('/first', {
templateUrl: 'pages/first.html',
controller: 'mainController'
})
.when('/second', {
templateUrl: 'pages/second.html',
controller: 'mainController'
})
});
myApp.controller('mainController', ['$scope', '$log', function($scope, $log) {
$scope.names = [{fname:'john',lname:'doe'},{fname:'jane',lname:'doe'}];
$scope.addName = function(name){
$scope.names.push({fname:name,lname:'no last name'});
}
}]);
first 和 second.html 相同
<h1>Add name in first.html</h1>
<input type="text" ng-model="name" />
<button ng-click="addName(name)">add name</button>
这是设计使然。
$scope
仅限于控制器的范围,即在 ng-view
内呈现的所有内容。这意味着有两个名为 names
的集合,一个在应用程序范围内,一个在控制器范围内。当您修改控制器内的 names
集合时,它只会修改此集合,而不是应用程序根级别中引用的集合。 (我假设你将 mainController
绑定到 body 标签,否则 index.html 中的 addName() 将不起作用。这本身不是一个很好的选择,你不应该将另一个控制器实例放入本身,除非你绝对知道你在做什么。)
处理这种情况的正确方法是将 names
集合和 addName() 函数放入您注入控制器的服务中。