Angularjs 从ng init引用范围的角度变化属性
我有一个输入和一个按钮,我想当按钮点击时,输入的值会改变:Angularjs 从ng init引用范围的角度变化属性,angularjs,angularjs-directive,angularjs-ng-repeat,Angularjs,Angularjs Directive,Angularjs Ng Repeat,我有一个输入和一个按钮,我想当按钮点击时,输入的值会改变: <input type="text" ng-model='myModel'> <button ng-click="changeMyModel()">my button</button> 它可以工作,但当我想将myModel传递到changeMyModel()函数时: <input type="text" ng-model='myModel'> <button ng-click="c
<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel()">my button</button>
它可以工作,但当我想将myModel传递到changeMyModel()函数时:
<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel(myModel)">my button</button>
$scope.changeMyModel = function (myModel) {
myModel = 'new value';
}
我的纽扣
$scope.changeMyModel=函数(myModel){
myModel='新值';
}
它不起作用
我真的希望将一个属性传递到函数中,因为当我使用ng repeat时,每个循环的模型都不同,并且在循环时,我不能在数组的n个元素的作用域中声明n var(我有$sope.objects):
我的纽扣
您应该将变量定义为对象,如@shaunhusain所述
我举了个例子
还有一个建议是,不能通过添加一些修饰符将的字符串属性作为对象来处理,这真的很不酷 你想做什么
$scope.user = "name";
$scope.setthisscopevariable = function(scopevariable) {
scopevariable = "newname";
}
$scope.setthisscopevariable($scope.user);
但这只是计算为var scopevariable=“newname”,因为它传入字符串,而不是对范围的引用。如果不将$scope.user更改为具有要设置的属性的对象,则无法将其作为引用传递
所以你可以
$scope.user = "name";
$scope.setthisscopevariable = function(scopevariable) {
/* not doing anything with scopevariable by you could */
return "newname";
}
$scope.user = $scope.setthisscopevariable($scope.user);
在控制器中,使用不知道对象的函数来设置值是很好的
当绑定到一个模型时,它可能看起来像这样
<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel('myModel')">my button</button>
$scope.changeMyModel(modelName) {
$scope[modelName] = "newname";
};
我的纽扣
$scope.changeMyModel(modelName){
$scope[modelName]=“newname”;
};
我没有测试,但我认为它应该有效。它允许您将$scope.myModel引用作为字符串传入,这样您就可以使用数组语法在$scope中访问该模型。这并不像您希望的那样干净,因为您的函数仍然必须处理另一个答案中存在对象和子对象的事实,但它允许您将子对象作为字符串传递,而不是创建爬行的子对象。如果您想更进一步,让函数存在于库中的控制器之外,那么仍然需要考虑需要传入对象
<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel('myModel')">my button</button>
$scope.changeMyModel(modelName) {
changeText($scope, modelName);
};
var changeText = function(obj, property) {
obj[property] = "newname";
}
我的纽扣
$scope.changeMyModel(modelName){
changeText($scope,modelName);
};
var changeText=函数(对象,属性){
obj[property]=“newname”;
}
我不能用抽象的编码术语来回答这个问题,所以我想我只是试着用一个外行的例子 在ng repeat中,可以修改对象,您可以执行以下操作:
<div class="test" ng-controller="Ctrl">
<div ng-repeat="task in tasks">
<button ng-click="removeTask(task);">{{task.name}}</button>
</div>
<div>
或者您可以将列表中的项索引传递给函数,因为JS字符串是不可变的,这有一些副作用,它们的行为类似于原语,而不是对象。myModel属性应该是对象而不是字符串。如果它是一个具有属性的对象,并且您将该对象传递给函数,那么更改该模型的属性将是有效的。此外,ng init还有一个非常特殊的用例(用于ng重复引用$index或其他特殊属性),文档声明它不应用于其他上下文,而应在控制器中初始化内容。@shaunhusain即使我传递对象,它也不起作用,即使我传递数组的键,它也不起作用,@shaunhusain给出的建议很贴切。确保模型更改函数将实际对象作为参数,但通过其属性修改对象的值。这里是一个粗略的例子——请参阅,以了解有关如何出错和简单规则的更多详细信息。controllerAs语法稍微更改了此规则,但如果您使用的是原始样式,则此规则适用。下面的答案应该是好的,如果不是的话,展示一个有问题的plunkr。
<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel('myModel')">my button</button>
$scope.changeMyModel(modelName) {
$scope[modelName] = "newname";
};
<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel('myModel')">my button</button>
$scope.changeMyModel(modelName) {
changeText($scope, modelName);
};
var changeText = function(obj, property) {
obj[property] = "newname";
}
<div class="test" ng-controller="Ctrl">
<div ng-repeat="task in tasks">
<button ng-click="removeTask(task);">{{task.name}}</button>
</div>
<div>
var app = angular.module('app', []);
function Ctrl($scope) {
$scope.tasks = [{id:1,'name':'test1'}, {id:2,'name':'test2'}, {id:3,'name':'test3'}];
$scope.removeTask = function(task){
task.name = 'abc';
};
}