Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 从ng init引用范围的角度变化属性_Angularjs_Angularjs Directive_Angularjs Ng Repeat - Fatal编程技术网

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';
  };
}