通过ng-init引用的范围的角度变化属性

时间:2014-09-15 05:14:04

标签: angularjs angularjs-directive angularjs-ng-repeat

我有一个输入和一个按钮,我想在点击按钮时,输入的值将会改变:

<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel()">my button</button>

在控制器中:

$scope.changeMyModel = function () {
   $scope.myModel = 'new value';
}

它有效,但是当我想将myModel传递给changeMyModel()函数时:

<input type="text" ng-model='myModel'>
<button ng-click="changeMyModel(myModel)">my button</button>

$scope.changeMyModel = function (myModel) {
   myModel = 'new value';
}

不起作用

我真的想要将属性传递给函数,因为当我使用ng-repeat时,每个循环,模型都不同,并且我不能在循环时为数组的n个元素声明n var;我有$ sope .objects):

    <div ng-repeat="object in objects">
            <input type="text" ng-model='object'>
            <button ng-click="changeMyModel(object )">my button</button>
    </div>

3 个答案:

答案 0 :(得分:1)

您应该将变量定义为对象,如@shaunhusain,

所述

我做了一个例子for you

 function($scope){
       $scope.user = {};
        $scope.user.name = 'test'
       $scope.changeMyModel = function (myModel) {
          myModel.name = 'new value';
       }
    })

并建议read

答案 1 :(得分:1)

通过添加一些修饰符,您无法将对象的字符串属性视为对象,这真的不酷。

你想做。

$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.myModel引用,以便您可以使用Array语法在$ 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"; 
}

我无法用抽象的编码术语来回答它,所以我想我只是尝试一个非专业人士的例子。 :)

答案 2 :(得分:1)

在ng-repeat中,修改对象是可以的,你可以这样做:

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

或者您可以将列表中的项目索引传递给您的函数