【问题标题】:AngularJS Edit JSON data using formsAngularJS 使用表单编辑 JSON 数据
【发布时间】:2018-03-12 13:44:34
【问题描述】:

在 AngularJS 中,我正在尝试从 JSON 数据制作和编辑 TreeView。我想从 JSON 中获取一个 nodevalue 并使用表单对其进行编辑。编辑时,原始 JSON 应立即更改。我为此在 plunkr 下创建但不知道如何实现这一点。

Plunkr

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

app.directive('collection', function () {       
    return {
        restrict: "E",
        //replace: true,
        scope: {collection: '='},
        //controller: 'TreeController',
        //bindToController: true,       
        template: "<ul><member ng-repeat='member in collection' member='member'></member></ul>"         
    }
})

app.directive('member', function ($compile) {
    var linkerfunc = function(scope, element, attrs) {  
                    var collectionSt = '<collection collection="member.children"></collection>';
                    $compile(collectionSt)(scope, function(cloned, scope)   {                                           
                        element.append(cloned); 
                     });
                     scope.ShowDetailsFunc = function() {   
                       console.log('in function scope showdetails')
                        scope.ShowDetailsCtrlFunc(element,event);                     
                    } 
    }
    return {
        restrict: "E",
        //replace: true,
        scope: {member: '=', ShowDetailsCtrlFunc : '&'},
        template: "<li><span ng-click=ShowDetailsCtrlFunc($event)>{{member.NodeName}}</span></li>",     
        controller: 'MainCtrl',
        //controllerAs: 'MainCtrl',
        //bindToController: true,
        link: linkerfunc        
    }
})

app.controller('MainCtrl', function ($scope,$timeout) {     

    $scope.Intialfunc = function() { 
        $scope.testdata = []
        var myjsondata = JSON.parse('{ "NodeName": "Parent", "NodePath": "1", "children": [ { "NodeName": "mychild", "NodePath": "1.1", "children": [ { "NodeName": "chld1", "NodePath": "1.1.1", "children": [] } ] } ] }');
        $scope.testdata.push(myjsondata);
            //console.log($scope.testdata) //This one is showing
            $scope.changename = $scope.testdata[0].children[0].children[0].NodeName;    

        }   

    $timeout(function(){ $scope.Intialfunc(); }, 1000)

    $scope.ShowDetailsCtrlFunc = function(event) {
            console.log("in function ShowDetailsCtrlFunc"); 

            //event.stopImmediatePropagation(); 
      };
});

我尝试了 angular.copy,但这需要 $scope 变量中的 JSON 数据部分并按预期更新该变量。

但是我的 JSON 数据会很大,我不知道如何在不使用变量的情况下更新它。请帮忙。

【问题讨论】:

    标签: angularjs angularjs-forms


    【解决方案1】:

    您可以使用ng-change 在输入更改时执行操作:

    <input type="text" ng-model="changename" ng-change="inputChange()">
    

    然后,只需在您的控制器中创建一个函数来更新您需要的内容:

    $scope.inputChange = function() {
      // do stuff here
      $scope.testdata[0].children[0].children[0].NodeName = $scope.changename;
      // write object to JSON
      var JSONstring = $scope.testdata.toJSON();
    }
    

    我还建议您查看ng-model-options 并更改去抖动设置,这样您就不会在每次击键时都不断toJSON

    http://plnkr.co/edit/dPWsowm4Puwajgk6CfvA?p=preview

    【讨论】:

    • 太棒了!这正是我想要的。没想到会这么简单。谢谢@Pop-A-Stash。
    • 但是只有一个问题。如果路径“$scope.testdata[0].children[0].children[0].NodeName”太长,可能会出现性能问题。
    • 我同意。这根本不是一个长期的解决方案。我只是向您展示如何在表单字段更改时进行更改。理想情况下,您会将 JSON 中的每个节点映射到一个范围变量和一个匹配的表单输入,其中包含 ng-change 指令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2017-03-04
    相关资源
    最近更新 更多