如何从ng-repeat输入控制ng-repeat div

时间:2014-02-16 07:36:30

标签: html angularjs jquery-mobile dynamic input

所以,刚刚开始使用Angular,它非常棘手,来自一个非常简单的JS和jQuery背景。这就是我想要做的。我有一个“标签模板”,它有几个类别,然后包含一些子标签。我已将这些定义为一个对象,其理念是可以通过文件请求调用对象/文件并进行操作等。

我已使用工厂服务和带有ng-repeat的控制器动态加载标签和标签类别输入。同样,我已将子标签存放到第2页的另一个div中(使用jQuery移动页面滑动)。我想使用类别标签的复选框状态来显示/隐藏第2页上的子标签。

我已经尝试了很多东西并在遍历堆栈交换,网络等方面进行了搜索,但是它简单明了,类似于我可以让它工作。如果有人可以指出我正确的方向,那将是伟大的。请记住,我的下一步是在第1页添加一个按钮以添加新类别,并在第2页添加按钮以将子标记添加到子标记类别。

最后,我还有一个奇怪的事情要报告。如果我的DOM中只有两个页面,那么在加载页面时我会有一些奇怪的行为。如果我从第1页加载,标签复选框不起作用,我看到标签边框略微肥胖。如果我向左滑动到第2页并从此页面重新加载,标签的边框很薄,复选框起作用。无法追查为什么会发生这种情况。我的hacky解决方法是添加一个空页面零,然后立即更改页面到第一页,但这远非理想。对此的任何想法也将受到赞赏。

这是:

HTML

  

                     

   <!-- Angular version    -->

            <button class="ui-btn" onclick="selectTemplate();">My Template</button> 
            <form>
                <div data-role="controlgroup">
                    <fieldset data-role="controlgroup"> 
                       <div ng-controller="templateCtrl">
                            <label 
                            class="ui-checkbox" 
                            ng-style="{backgroundColor: '{{tagCat.color | bgColor}}'}" 
                            ng-repeat="tagCat in template"><input type="checkbox" 
                            class="ui-checkbox" 
                            id="{{tagCat.name}}" 
                            ng-model="clicked"
                            ng-click="click();" 
                            />{{tagCat.name}}</label>
                            <div ng-repeat="tagCat in template">{{cb}} {{tagCat.name}} hallo</div>
                        </div>

                    </fieldset>
                </div>
                <div style="display:none" class="flashNotification"></div>        
            </form>                 
    </div>

    <div data-role="page" id="two">
        <button class="ui-btn" onclick="selectTemplate();">My Template</button> 
            <form>
                <div data-role="controlgroup">
                    <div ng-controller="templateCtrl">
                        <div ng-repeat="tagCat in template" ng-show="clicked" class="{{tagCat.name}}">{{tagCat.name}}
                            <fieldset data-role="controlgroup">
                                <label class="ui-checkbox" 
                                ng-repeat="item in tagCat.items" 
                                ng-style="{backgroundColor: '{{tagCat.color | bgColor}}'}" 
                                for="item.name">{{tagCat.color | bgColor}}
                                <input class="ui-checkbox" 
                                name="{{item.name}}" 
                                id='{{item.name}}' 
                                type="checkbox" />{{item.name}}</label>
                            </fieldset>
                        </div>
                    </div>                  
                </div>
                <div style="display:none" class="flashNotification"></div>        
            </form>
    </div>
</div>

JS for jQuery Mobile

$(document).ready(function() {
  // addTemplateItems(tagTemplate); // not necessary with Angular
  // $.mobile.changePage('#two', { transition: 'none' });  // required or checkboxes don't work on load
  $.mobile.changePage('#one', { transition: 'none' }); 
//   // $("[data-role=controlgroup]").controlgroup("refresh");

  // set up page nav
  $(document).delegate('.ui-page', "swipeleft", function(){
      var $nextPage = $(this).next('[data-role="page"]');
      var $prevPage = $(this).prev('[data-role="page"]');

      console.log("binding to swipe-left on "+$(this).attr('id') );
      // swipe using id of next page if exists
      if ($nextPage.length > 0) {
          $.mobile.changePage($nextPage, { transition: 'slide' });
      } else {
          var message = 'tagged!';

          // save tags here

          flashNotify(message);
          console.log('fire event!');
          $('#flashNotification').promise().done(function () {
            $('#group1').hide();
            $('#group2').hide();
            $('.ui-btn').hide();
            // addTemplateItems(tagTemplate);
            $.mobile.changePage($prevPage, { transition: 'none' });
            captureImage();
          }); 
      }
  }).delegate('.ui-page', "swiperight", function(){
      var $prevPage = $(this).prev('[data-role="page"]');
      console.log("binding to swipe-right on "+$(this).attr('id') );
      // swipe using id of next page if exists
      if ($prevPage .length > 0) {
          $.mobile.changePage($prevPage, { transition: 'slide', reverse : true });
      } else {
          alert('no backy backy!');
      }
  });

// $("input[type='checkbox']").checkboxradio().checkboxradio("refresh");

});

JS for Angular App

var app = angular.module('STL', []);

app.factory('TagTemplate', [function () {

  var TagTemplate = {};

  var tagTemplate = {
    family: {
      name: "family",
      description: "These are your family members.",
      color: "red",
      items: [
        {
          name: "Joe"
        },
        {      
          name: "Mary"
        },
        {
          name: "Jim"
        }
      ]
    },
    design: {
      name: "design",
      description: "Different types of design notes.",
      color: "blue",
      items: [
        {
          name: "inspiring"
        },
        {
          name: "fail"
        },
        {
          name: "wayfinding"
        },
        {
          name: "graphics"
        }
      ]
    },
    work: {
      name: "work",
      description: "Stuff for work.",
      color: "green",
      items: [
        {
          name: "whiteboard"
        },
        {
          name: "meeting"
        },      
        {
          name: "event"
        }
      ]
    }
  };

  TagTemplate = tagTemplate;

  return TagTemplate;
}])



// Controller that passes the app factory

function templateCtrl($scope, TagTemplate) {
  $scope.template = TagTemplate;

  $scope.click = function(model) {
    console.log(this.checked, this.tagCat.name);
  }


}


app.filter('bgColor', function () {
  return function (color) {
    // console.log(color, $.Color(color).lightness(.05).toHexString(.05));
    // var rgba = $.Color(color).alpha(.05);

    return $.Color(color).lightness(.97).toHexString();
  }
})

1 个答案:

答案 0 :(得分:0)

主要部分,成功!

我发现了一个jsfiddle给了我一个很好的实验基础。经过一些游戏,我意识到我只需要在我的数据服务模型中的每个类别中创建一个show属性,然后将ng-model分配给该属性来控制它。

我必须在自己的代码中略有不同,但从后面的jsfiddle获得的理解让我得到答案:

http://jsfiddle.net/Y43yP/

HTML

<div ng-app ng-controller="Ctrl">
    <div class="control-group" ng-repeat="field in customFields">
        <label class="control-label">{{field}}</label>
        <div class="controls">
            <input type="text" ng-model="person.customfields[field]" />
            <label><input type="checkbox" ng-model="person.show[field]" /></label>
        </div>
    </div>

    <button ng-click="collectData()">Collect</button><button ng-click="addField()">Add Field</button><br/><br/>

    <em>Booleans</em>
    <div ng-repeat="field in customFields">
        <p>{{field}}: {{person.show[field]}}</p>
    </div>
    <em>Show/Hide</em>
    <div ng-repeat="field in customFields">
        <p ng-show="person.show[field]">{{field}}: {{person.customfields[field]}}</p>
    </div>
</div>

JS

function Ctrl($scope) {
    $scope.customFields = ["Age", "Weight", "Height"];
    $scope.person = {
        customfields: {
             "Age": 0,
             "Weight": 0,
             "Height": 0
        },
         show: {
             "Age": false,
             "Weight": false,
             "Height": false
        }
    };

    $scope.collectData = function () {
        console.log($scope.person.customfields, $scope.person.show);
    }

    $scope.addField = function () {
        var newField = prompt('Name your field');
        $scope.customFields.push(newField);

    }
}

仍有复选框问题,但如果我无法解决问题,我会为此另外打开一个问题。

感谢。