如何在角度工厂内定义ngModel?

时间:2016-04-29 07:01:56

标签: javascript angularjs

我在指令中有一个范围。我能够访问我工厂内的指令范围但是在获得范围之后我需要将它与输入控件绑定以进行双向绑定。

例如指令范围:此范围从控制器获取,然后分配给指令。

 $scope.model = {
    "entityinfo": {
      "entity":"",
      "tenantId":"292FEC76-5F1C-486F-85A5-09D88096F098",
      "timeStamp":"2015-12-15T10:16:06.322Z"
    },
    "collections":{}
 }

我需要将此范围绑定到输入控件

var template='<input  ng-model="model[tranobj].rowset[0][field]">';

这里将动态获取tranobj和field。问题是我将行集定义为数组,但它是属性中的对象&#39; 0&#39;。

它是这样进来的:

"Customer29Jan16": {
      "rowset": {
        "0": {
          "CuId": "dgdfg",
          "Name": "dgdgf",
          "Quantity": "3",
          "Rate": "5",
          "Amount": "4"
        }
      }
    }

但我需要这样:

"Customer29Jan16": {
      "rowset": [
         {
          "CuId": "dgdfg",
          "Name": "dgdgf",
          "Quantity": "3",
          "Rate": "5",
          "Amount": "4"
        }
        ]
    }

指令代码补充:

bosAppModule.directive('layoutTableCellControlControlRender',['$compile','layoutRenderingControlsFactory','soObjectFactory','$parse', function($compile,layoutRenderingControlsFactory,soObjectFactory,$parse){
    var layoutTableCellControlRenderObj={};
    linkFnTableCellControlRender=function(scope, element, attributes, controllerCtrl) {
        scope.controlData="NOCONTROLDATA";
        var controlContent="";
        var bindingPath = "";
        angular.forEach(scope.mapperData.collections.controltype.rowset, function (value, index) {
            if(value.controltypeid==scope.controlId){
                scope.controlData=value.controltypename;
                if(scope.controlData){
                    controlContent=angular.element(layoutRenderingControlsFactory[scope.controlData](scope.controlId, bindingPath));
                    $compile(controlContent)(scope);
                    element.append(controlContent);
                }else{
                    console.log("## control data not matching");
                }

            }
        }); 

    };  
    layoutTableCellControlRenderObj.scope={attributeId:'=',controlId:'=',layoutData:'=',pageObject:'=',mapperData:'=', cellControlId:'=', soData:"=",model:"=",field:"@",tranobj:"@" };
    layoutTableCellControlRenderObj.restrict='AE';
    layoutTableCellControlRenderObj.replace='true';
    layoutTableCellControlRenderObj.template="<div class='col-xs-12 col-sm-12 col-md-6 col-lg-6' ng-attr-id={{cellControlId}} cell-control-id='tablecellcontrol.layouttablecellcontrolcellcontrolid' " +
                                            "control-id='tablecellcontrol.layouttablecellcontrolcontroltypeid' " +
                                            "layout-data='layoutData' page-object='pageObject' mapper-data='mapperData' attribute-id='tablecellcontrol.layouttablecellcontrolbindingobjectattributeid'" +
                                            "model='model' field={{tablecellcontrol.attributename}} tranobj={{tablecellcontrol.objectname}}>" +

        layoutTableCellControlRenderObj.link = linkFnTableCellControlRender;
    return layoutTableCellControlRenderObj; 
}]);

1 个答案:

答案 0 :(得分:1)

您必须将对象映射到对象数组。您可以浏览此链接Converting a JS object to an array

你可以在控制器里面这样做

var array = [];
angular.forEach(Customer29Jan16.rowset, function(object, index) {
    array.push(object);
});

console.log(array);
Customer29Jan16.rowset = array;