2016-02-06 67 views
0

我試圖動態編譯並在指令中添加一個指令和動態屬性;但是,我不斷收到錯誤。在循環內動態生成角度指令

任何人都知道爲什麼?

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

angular.module('plunker', []) 

    .controller('MainCtrl', function($scope) { 
    var vm = this; 
    vm.foo = { 
     bar: 'world' 
    }; 
    }).directive('addEditConfig', AddEditConfig) 

    .directive('inputElement', InputElement); 


function AddEditConfig($compile) { 
    var directive = { 
     restrict: 'E', 
     scope: { 
      edit: '@', 
      config: '=', 
      display: '=', 
      parentController: '=' 
     }, 
     template: '<div id="dynamicForm"></div>', 
     controllerAs: 'vm', 
     bindToController: true, 
     controller: AddEditConfigController, 
     link: linkFunction 
    } 

    return directive; 

    function linkFunction(scope, element, attr, ctrl) { 
     var params = [{description: 'foo', value:'bar'}, {description: 'foo', value:'bar'}, {description: 'foo', value:'bar'}, {description: 'foo', value:'bar'}]; 
     for (var i = 0; i < params.length; i++) { 
      angular.element(document.getElementById('dynamicForm')).append($compile('<input-element param="' + params[i] + '"></input-element>')(scope)); 
     } 
    } 
}; 

function AddEditConfigController() { 
}; 

function InputElement() { 
    var directive = { 
     restrict: 'E', 
     scope: { 
      param: '=' 
     }, 
     controllerAs: 'vm', 
     bindToController: true, 
     template: '<div class="form-group"> <div class="col-md-8"> <input id="port" name="textinput" type="text" placeholder="{{vm.param.description}}" class="form-control input-md" ng-model="vm.param.value"/> </div></div>', 
     controller: InputElementController, 
     link: linkFunction 
    } 
    return directive; 

    function linkFunction(scope, el, attr, ctrl) { 
    } 
}; 

function InputElementController() { 
    var vm = this; 

} 

回答

0

的問題(其中至少一個)是在此聲明:

angular.element(document.getElementById('dynamicForm')).append($compile('<input-element param="' + params[i] + '"></input-element>')(scope)); 

寫這param="' + params[i] + '"生成以下DOM param="[Object Object]"。 所以它永遠不會按預期工作。

angular.module('plunker', []) 

    .controller('MainCtrl', function($scope) { 
    var vm = this; 
    vm.foo = { 
     bar: 'world' 
    }; 
    }).directive('addEditConfig', AddEditConfig) 

    .directive('inputElement', InputElement); 


function AddEditConfig($compile) { 
    var directive = { 
     restrict: 'E', 
     scope: { 
      edit: '@', 
      config: '=', 
      display: '=', 
      parentController: '=' 
     }, 
     template: '<div id="dynamicForm"><input-element param="param" ng-repeat="param in vm.params"></input-element></div>', 
     controllerAs: 'vm', 
     controller: AddEditConfigController 
    } 
    return directive; 
}; 

function AddEditConfigController() { 
    this.params = [{description: 'foo', value:'bar'}, {description: 'foo1', value:'bar1'}, {description: 'foo2', value:'bar2'}, {description: 'foo3', value:''}]; 
}; 

function InputElement() { 
    var directive = { 
     restrict: 'E', 
     scope: { 
      param: '=' 
     }, 
     template: '<div class="form-group"> <div class="col-md-8"> <input id="port" name="textinput" type="text" placeholder="{{param.description}}" class="form-control input-md" ng-model="param.value"/> </div></div>' 
    } 
    return directive; 

}; 

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

+0

我想我可能得到它想通了:爲實現這一

一種方式http://plnkr.co/edit/m6zL2ziidu9NnWZpiHOO?p=preview 哪種方式你認爲會被認爲是「最佳實踐」嗎?我不太喜歡ng-repeats,因爲我無法調試他們。 :( – Deo

+0

'$ compile('')'是一個很好的例子,我只是覺得'ng-repeat'會讓你的代碼那麼爲什麼重新發明輪子?順便說一句:這個問題證明你的實現不容易調試,呵呵;) –

+0

如果你知道調試html邏輯的方法,真的很想了解它。 :) – Deo