【发布时间】:2016-03-08 07:32:21
【问题描述】:
我想创建一个 $scope 函数,它只会操纵它接收到的变量。
我制作了一个 working Plunker 来测试一下。
我有一个 ng-repeat,它只是列出小猫的名字和 id。我还有一个输入表单来接收新小猫的名字。然后,我有 3 个按钮,每个按钮都访问一个不同的 $scope 函数,该函数将以不同的方式操作 $scope。
每个函数的目标是从输入表单中读取小猫的名字,读取小猫上使用的最后一个id数组,将该 id+1 分配给新小猫,将新小猫推送到小猫数组并删除表单数据。。 p>
第一个函数,
$scope.addFullScope(), 将不接收任何参数,并将读取和操作来自$scope的所有内容。第二个函数,
$scope.addJustDelete(kitty, kitties), 将接收新的kitty和kitties数组作为参数。但是,最后,要清理表单,它会做$scope.kitty = undefined第三个函数,
$scope.addNoScope(kitty, kitties), 将接收新的kitty和kitties数组作为参数。但是,最后,要清理表单,它将执行kitty = undefined。 但表单不会清理!而且所有内容都会出现问题。
我怎样才能使第三个函数或类似的函数工作,以便我有一个完全独立的函数可以使用?
附录:
HTML:
<body ng-app='app' ng-controller="ctrl">
<h3 ng-repeat="kitty in kitties">
{{kitty.name}}: {{kitty.id}} //Kitties list
</h3>
<input placeholder='Kitty name to add' class='form form-control'
type="text" ng-model="kitty.name" />
<h3> $scope use on adding kitty:</h3>
<button ng-click="addFullScope()">Full Scope.</button>
<button ng-click="addJustDelete(kitty, kitties)">Just delete.</button>
<button ng-click="addNoScope(kitty, kitties)">None. Buggy</button>
</body>
控制器:
.controller('ctrl', function($scope) {
$scope.kitties = [
//Let's imagine kitties in here.
{name: 'Purple kitty', id:35},
//Kittie 36 died in a car accident. :(
{name: 'Rodmentou cat', id: 37},
{name: 'Fatty kitty', id: 38}
];
$scope.addFullScope = function () {
var size = $scope.kitties.length;
var id = $scope.kitties[size-1].id + 1;
$scope.kitty.id = id;
$scope.kitties.push($scope.kitty);
$scope.kitty = undefined;
};
$scope.addJustDelete = function (kitty, kitties) {
var size = kitties.length;
var id = kitties[size-1].id + 1;
kitty.id = id;
kitties.push(kitty);
$scope.kitty= undefined;
};
$scope.addNoScope = function (kitty, kitties) {
var size = kitties.length;
var id = kitties[size-1].id + 1;
kitty.id = id;
kitties.push(kitty);
kitty = undefined; //Don't work
};
});
【问题讨论】:
-
这与
var a=99;(function(a){a=0;})(a);console.log(a);打印99的原因相同。对象是通过引用传递的,addNoScope只是让局部变量引用undefined而不是原来的对象,但是并没有被删除。 -
你不能有一个使用
$scope作为其模型的表单,并期望一个函数在不接触$scope的情况下操作该表单 -
您应该使用服务而不是操纵 $scope。 kittenService 可以公开一个 kittens 列表和一个方法来推送一个新的列表来处理 id 生成。
-
我唯一关心的是如何在不触及范围的情况下删除表单的答案。
标签: javascript html arrays angularjs angularjs-scope