我实际上不确定问题的标题应该是什么,因为我不清楚我错过了什么。
我把它归结为一个非常简单的例子(实际案例更复杂)。我在ng-switch内有一个文本框和按钮。我读过的开关创建了它自己的本地范围。
单击按钮时,我想要做的是将文本框的值传递给函数。在函数中,我将执行需要对值进行的操作,然后清除文本框。我很难找到正确的方法来做到这一点。
控制器代码:
$scope.temp = 1;
$scope.tempCall = function (tempModel) {
tempModel = ""; //this doesn't work
$scope.tempModel = ""; //nor does this
};
HTML /模板:
<div ng-switch on="temp">
<div ng-switch-when="1">
<input ng-model="tempModel" />
<input type="button" ng-click="tempCall(tempModel)" />
</div>
<div ng-switch-when="2">TWO</div>
</div>
我相信我实际上可以从父范围或根范围遍历范围并清除值,但这并不“感觉”正确。清除此值的正确(Angular)方法是什么?
答案 0 :(得分:3)
在角度范围中处理原始值时,不能从子范围覆盖父范围中的值。这是因为angular使用了javascript原型继承。
在这种情况下,您可以做的是在父作用域中创建一个对象,然后您可以更新子作用域中的值。因为您没有覆盖对象(只有附加到它的属性),所以引用有效。
我在plunk上创建了一个这样的演示,你可以view it here
$scope.temp = 1;
$scope.tempModel = {};
$scope.tempCall = function () {
$scope.tempModel.previous = $scope.tempModel.value
$scope.tempModel.value = "";
};
<div ng-switch on="temp">
<div ng-switch-when="1">
<input ng-model="tempModel.value" />
<input type="button" ng-click="tempCall()" />
{{tempModel.previous}}
</div>
<div ng-switch-when="2">TWO</div>
答案 1 :(得分:1)
这是一种方法:
<input type="button" ng-click="tempCall(tempModel);tempModel='';" />
可能更多的“Angular方式”是在模型中使用点,如:
<input type="text" ng-model="tempModel.value" />
然后通过传递tempModel
对象来调用您的函数,如:
<input type="button" ng-click="tempCall(tempModel)" />
然后您将能够通过以下方式清除值:
$scope.tempCall = function (tempModel) {
tempModel.value = "";
};
为了防止数据绑定问题,“经验法则是,如果你使用ng-model,必须在某处有一个点。” MiškoHevery