Javascript AngularJS:同时更新$scope中的所有对象

Javascript AngularJS:同时更新$scope中的所有对象,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,假设我在$scope中存储了一个对象,如下所示: $scope.todo = [ { "title" : "Groceries", "todoItems" : [ { "title" : "Milk", "status" : "Not Done" }, { "title" : "Eggs", "status" : "Not Done" }, {

假设我在
$scope
中存储了一个对象,如下所示:

$scope.todo = [
  {
    "title" : "Groceries",
    "todoItems" : [
      {
        "title" : "Milk",
        "status" : "Not Done"
      },
      {
        "title" : "Eggs",
        "status" : "Not Done"
      },
      {
        "title" : "Bread",
        "status" : "Done"
      }
    ]
  },
  {
    "title" : "Medical",
    "todoItems" : [
      {
        "title" : "Make eye doctor appointment",
        "status" : "Not Done"
      },
      {
        "title" : "Go to pharmacy",
        "status" : "Not Done"
      },
      {
        "title" : "Take vitamins",
        "status" : "Done"
      }
    ]
  }
];
我正在创建一个功能,允许对每个待办事项进行内联编辑,如下所示:

我通过切换todo列表项上名为editMode的属性来实现这一点。请参见以下代码块中的第11-14行:

<div ng-app="myApp">
  <div ng-controller="dashBoard">
    <div class="panel panel-default list-[(listID)]" ng-repeat="(listID, todoList) in todo" ng-cloak>
      <div class="panel-heading">[( todoList.title )]</div>
        <ul class="list-group">
          <li ng-repeat="(itemID, todoItem) in todoList.todoItems" data-as-sortable="board.dragControlListeners" data-ng-model="items" class="status-[(todoItem.status)] todo-item todo-item-[(itemID)]" data-as-sortable-item>
            <div class="input-group">
              <span data-as-sortable-item-handle class="input-group-addon">
                <input ng-click="toggleStatus(listID, itemID, todoItem.status)" type="checkbox" ng-checked="todoItem.status == 1">
              </span>
              <span ng-if="!todoItem.editMode" class="todo-item-label-wrapper">
                <div ng-click="toggleEditMode(listID, itemID, 1)" class="todo-item-label">[(todoItem.value)]</div>
              </span>
              <span ng-if="todoItem.editMode" class="todo-input-wrapper">
                <input show-focus="todoItem.editMode" ng-keyup="$event.keyCode == 13 && toggleEditMode(listID, itemID, 0)" type="text" ng-model="todoItem.value" class="form-control">
              </span>
            </div>
          </li>
        </ul>
    </div>
  </div>
</div>

但是我想知道angular是否对这个用例有一些我应该使用的实用程序。

在这种情况下,我所做的不是在每个项上都有一个
editMode
属性,而是使用一个范围变量,比如
$scope.currentEditItemId
。然后你可以这样做:

$scope.toggleEditMode = function (listID, itemID, enableEdit) {
    if (enableEdit === 1) {
        $scope.currentEditItemId = itemId;
        // ... whatever you need to do here
    }
}
<span ng-if="itemId != currentEditItemId" class="todo-item-label-wrapper">
    <div ng-click="toggleEditMode(listID, itemID, 1)" class="todo-item-label">[(todoItem.value)]</div>
</span>
<span ng-if="itemId == currentEditItemId" class="todo-input-wrapper">
    <input show-focus="todoItem.id == currentEditItemId" ng-keyup="$event.keyCode == 13 && toggleEditMode(listID, itemID, 0)" type="text" ng-model="todoItem.value" class="form-control">
</span>
HTML将如下所示:

$scope.toggleEditMode = function (listID, itemID, enableEdit) {
    if (enableEdit === 1) {
        $scope.currentEditItemId = itemId;
        // ... whatever you need to do here
    }
}
<span ng-if="itemId != currentEditItemId" class="todo-item-label-wrapper">
    <div ng-click="toggleEditMode(listID, itemID, 1)" class="todo-item-label">[(todoItem.value)]</div>
</span>
<span ng-if="itemId == currentEditItemId" class="todo-input-wrapper">
    <input show-focus="todoItem.id == currentEditItemId" ng-keyup="$event.keyCode == 13 && toggleEditMode(listID, itemID, 0)" type="text" ng-model="todoItem.value" class="form-control">
</span>

[(todoItem.value)]

再回顾一下,我意识到可以同时更新范围中的所有内容的一种方法是通过构造函数实例化
$scope
中的每个项目,然后更新构造函数原型。这并不能真正解决我上面提出的原始用例(最好说是“更新范围内的所有项目,除了一个”),但我认为它仍然有一些有用的应用程序

因此,如果您希望某个项目在单击时更新许多其他项目,您可以执行以下操作:

$scope.toggleEditMode = function (listID, itemID, enableEdit) {
    if (enableEdit === 1) {
        $scope.currentEditItemId = itemId;
        // ... whatever you need to do here
    }
}
<span ng-if="itemId != currentEditItemId" class="todo-item-label-wrapper">
    <div ng-click="toggleEditMode(listID, itemID, 1)" class="todo-item-label">[(todoItem.value)]</div>
</span>
<span ng-if="itemId == currentEditItemId" class="todo-input-wrapper">
    <input show-focus="todoItem.id == currentEditItemId" ng-keyup="$event.keyCode == 13 && toggleEditMode(listID, itemID, 0)" type="text" ng-model="todoItem.value" class="form-control">
</span>
HTML:

  <div ng-app="myApp" ng-controller="toDo">
    <div ng-click="toggleEdit(index)" ng-class="{{item.editable}}"  ng-repeat="(index, item) in items"> {{item.title}} </div>
  </div>
var app = angular.module('myApp', []);

function newItem(title) {
  this.title = title;
}
newItem.prototype.editable = 'foo';

function toggleAll() {
  newItem.prototype.editable = 'bar';
}

app.controller('toDo', function($scope) {
    $scope.items = []

    for (var i = 0; i <= 10; i++) {
      var item = new newItem("item" + i);
      $scope.items.push(item);
    }

    $scope.toggleEdit = function(index) {
      toggleAll();
    }

});

{{item.title}
JS:

  <div ng-app="myApp" ng-controller="toDo">
    <div ng-click="toggleEdit(index)" ng-class="{{item.editable}}"  ng-repeat="(index, item) in items"> {{item.title}} </div>
  </div>
var app = angular.module('myApp', []);

function newItem(title) {
  this.title = title;
}
newItem.prototype.editable = 'foo';

function toggleAll() {
  newItem.prototype.editable = 'bar';
}

app.controller('toDo', function($scope) {
    $scope.items = []

    for (var i = 0; i <= 10; i++) {
      var item = new newItem("item" + i);
      $scope.items.push(item);
    }

    $scope.toggleEdit = function(index) {
      toggleAll();
    }

});
var-app=angular.module('myApp',[]);
函数newItem(标题){
this.title=标题;
}
newItem.prototype.editable='foo';
函数toggleAll(){
newItem.prototype.editable='bar';
}
应用程序控制器('toDo',函数($scope){
$scope.items=[]

对于(变量i=0;我添加了ng readonly=“!todoItem.editMode”在你的文本输入中,你可以使用ng blur。只有当你聚焦它时,才可以查看它。谢谢,这是一个很好的解决方案。虽然它在技术上不符合我的要求,但它确实使我要求的东西变得不必要。如果没有其他人使用问题描述中最初讨论的方法回复,我会将其标记为ac接受的回答。