【问题标题】:display only the elements with checked = true仅显示已选中的元素 = true
【发布时间】:2015-03-10 23:16:33
【问题描述】:

我有一个项目列表,可以选择选中或取消选中。

  <ion-item ng-repeat="sport in sports"
            ng-click="toggleSportSelection(sport)">
    {{:: sport.name}}
  </ion-item>

如果未选中这些项目,您将无法在此处看到它们

<div ng-show="sport.checked" ng-repeat="sport in sports">
      {{sport.name}}
</div>

每次您取消选中这些项目时,它们都会保存在数据库中。

我之所以在这里,是因为项目的默认行为是checked = true,所以不管它们是否保存在数据库中,如果刷新页面,所有项目都设置为@ 987654324@再次。

那么我能做些什么来避免这种行为,并且一旦项目被取消选中或选中,应用程序就会识别出来?

这是控制器的一部分

.controller('SportsController', function($scope, SportsFactory,
                                                AuthFactory) {

  SportsFactory.getSportChecked(customer).then(function(sportChecked) {
    _.each(sports, function(sport) {
      var intersectedSports = _.intersection(sport.id, sportChecked),
          checkedSportObjects = _.filter(sport, function(sportObj) {
           return _.includes(intersectedSports, sportObj);
        });
         _.each(checkedSportObjects, function(sport) {
            $scope.sports.push(sport);
          });
         });

    //here is the part where the default behavior is checked = true

      if (sports.length) {
        $scope.sports = _.map(sports, function(sport) {
          sport.checked = true;
          return sport;
        });
      }

    $scope.toggleSportSelection = function(sport) {
      var params = {};
      params.user = $scope.customer.customer;
      params.sport = sport.id;
      sport.checked = !sport.checked;
      SportsFactory.setSportChecked(params);
    };
});

更新

service.js

  setSportChecked: function(params) {
    var defer = $q.defer();
    $http.post(CONSTANT_VARS.BACKEND_URL + '/sports/checked', params)
    .success(function(sportChecked) {
        LocalForageFactory.remove(CONSTANT_VARS.LOCALFORAGE_SPORTS_CHECKED, params);
        defer.resolve(sportChecked);
      })
      .error(function(err) {
        console.log(err);
        defer.reject(err);
      });
    return defer.promise;
  },

和 NODEJS 部分

  sportChecked: function(params) {
    var Promise = require('bluebird');
    return new Promise(function(fullfill, reject) {
      console.time('sportChecked_findOne');
      SportSelection.findOne({
        user: params.user
      }).exec(function(err, sportChecked) {
        console.timeEnd('sportChecked_findOne');
        var newSport;
        if (err) {
          reject(new Error('Error finding user'));
          console.error(err);
        }else if (sportChecked) {
          newSport =  sportChecked.sport || [];
          console.log(newSport);
          console.time('sportChecked_update');
          if (_.includes(sportChecked.sport, params.sport)) {
            console.log('Sport already exists');
            console.log(sportChecked.sport);
            sportChecked.sport = _.pull(newSport, params.sport);
            // sportChecked.sport = _.difference(newSport, params.sport);
            console.log(sportChecked.sport);
          }else {
            newSport.push(params.sport);
            sportChecked.sport = newSport;
          }
          SportSelection.update({
            user: params.user
          },
          {
            sport: newSport
          }).exec(function(err, sportCheckedUpdated) {
            console.timeEnd('sportChecked_update');
            if (err) {
              reject(new Error('Error on sportChecked'));
            }else {
              fullfill(sportCheckedUpdated);
            }
          });
          if (sportChecked.sport) {
            sportChecked.sport.push(params.sport);
            console.log('New sport added');
          }else {
            sportChecked.sport = [params.sport];
          }
        }else {
          console.time('sportChecked_create');
          SportSelection.create({
            sport: [params.sport],
            user: params.user
          }).exec(function(err, created) {
              console.timeEnd('sportChecked_create');
              if (err) {
                reject(new Error('Error on sportChecked'));
              }else {
                fullfill(created);
              }
            });
        }
      });
    });
  },

我正在使用lodash,如果您能帮助我,我将不胜感激。

我的问题本身是:项目是否未选中无关紧要,一旦刷新页面,所有项目都会再次设置为checked = true。

有人说我可以用_.difference,但是怎么用呢?或者我能做什么?我在这里阅读您的建议。

【问题讨论】:

  • setSportChecked 是否会导致数据库中的checked 参数切换?如果有,怎么做?
  • @AustinMullins 看到我的更新

标签: javascript angularjs node.js underscore.js lodash


【解决方案1】:

这样的?

.controller('SportsController', function($scope, SportsFactory) {
  // get a list of all sports, with default value false
  SportsFactory.getAllSports().then(function(sports){
    $scope.sports = sports;
    // set all items to unchecked
    angular.each($scope.sports, function(sport) {
      sport.checked = false;
    });

    // get a list of checked sports for customer
    SportsFactory.getCheckedSports(customer).then(function(checkedSports) 
    {
      // set the sports in your list as checked
      angular.each(checkedSports, function(checkedSport){
        var sport = _.findWhere($scope.sports, {id: checkedSport.id});
        sport.checked = true;
    });

  });

  $scope.toggleSportSelection = function(sport) {
    // do your toggle magic here
  };
});

在您看来使用过滤器:

<div ng-repeat="sport in sports | filter:{checked:true}">
{{sport.name}}
</div>

【讨论】:

  • 你认为我与切换魔法有什么关系?我先做的不对吗? $scope.toggleSportSelection = function(sport) { sport.checked = !sport.checked; };
  • 实际上我猜如果我按照你说的做,一旦我刷新页面,所有设置为checked=false 的项目将再次变为checked=true
  • 我认为切换部分没有太大问题,这就是我没有包含它的原因。在您的if (sports.length),您将所有运动设置为选中,忽略服务器结果。另外,检查 toggleSport 方法是否在 then() 回调函数之外。
  • 所以你能帮我修改一下我的代码吗?对不起,我是新手
  • 好吧,试试我的建议 - 还要检查更新的答案,我将所有项目都设置为未选中,除了数据库中的检查结果。
猜你喜欢
  • 2012-08-17
  • 2021-06-19
  • 1970-01-01
  • 2021-09-27
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多