Angular函数通过引用传递范围变量

时间:2016-01-20 17:49:21

标签: javascript angularjs

问题

是否可以通过引用将范围变量(特别是数组)传递给使用ng-click调用的函数,并操纵所述变量的值?

更新 为了更明确,我的目标是避免在override func viewDidLoad() { super.viewDidLoad() self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "cancel") self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Done, target: self, action: "done") self.title = "Pick a Source" } func cancel() { self.dismissViewControllerAnimated(true, completion: nil) } func done() { //save things self.dismissViewControllerAnimated(true, completion: nil) } 中访问$ scope。

实施例

使用Javascript:

$scope.app.onItemClick

相关HTML:

(function() {
    angular.module('test', [])

    angular.module('test').controller('test',['$scope', function ($scope) {
      $scope.app = {};

      $scope.app.primarySet = [
        'test1',
        'test2',
        'test3'
      ]

      $scope.app.workingSet = [
        'test4',
        'test5',
        'test6'
      ]

      /*
       * Attempts to assign $scope.app.primarySet to $scope.app.workingSet using references to those two values.
       */
      $scope.app.onItemClick = function (primarySet, workingSet) {
        primarySet = workingSet
      }
    }])
  })()

有关此代码的更多信息,请参阅this Plunker

我对此代码的期望是按下按钮时<button type="button" ng-click="app.onItemClick(app.primarySet, app.workingSet)">Update Primary Set</button> 将设置为$scope.app.primarySet。不幸的是,这种情况并非如此。在调试时,在函数范围内,$scope.app.workingSet被分配给primarySet。但是workingSet不是。

动机

我的动机源于this SO reply。我同意如果我没有直接引用它,那么测试操作范围的方法会更容易。我还发现这比直接操作范围的函数更直接。

以前的研究

我遇到的唯一资源是this SO question。虽然这个问题很接近,但不同之处在于,有问题的参数是一个字符串,如果我理解正确,则无法修改作为参考,

2 个答案:

答案 0 :(得分:1)

JavaScript允许您以对象的形式访问对象的属性,因此您可以按如下方式修改模板:

<button type="button" ng-click="app.onItemClick(app, 'primarySet', app, 'workingSet')">Update Primary Set</button>

并将onItemClick方法修改为:

  $scope.app.onItemClick = function ( leftObject, leftProperty, rightObject, rightProperty) {
    leftObject[leftProperty] = rightObject[rightProperty];
  }

答案 1 :(得分:1)

如果您通过onItemClick传递$ scope.app槽,则可以更改$ scope中的primarySet,如下所示:

  (function() {
    angular.module('test', [])

    angular.module('test').controller('test',['$scope', function ($scope) {
      $scope.app = {};

      $scope.app.primarySet = [
        'test1',
        'test2',
        'test3'
      ]

      $scope.app.workingSet = [
        'test4',
        'test5',
        'test6'
      ]

      /*
       * Attempts to assign $scope.app.primarySet to $scope.app.workingSet using references to those two values.
       */
      $scope.app.onItemClick = function (app, workingSet) {
        app.primarySet = workingSet;
      }
    }])
  })()

<button type="button" ng-click="app.onItemClick(app, app.workingSet)">Update Primary Set</button>

原因是当您传递数组时,只将值传递给函数。