组件绑定不起作用:Angularjs

Posted

技术标签:

【中文标题】组件绑定不起作用:Angularjs【英文标题】:Component binding not working : Angularjs 【发布时间】:2017-05-02 23:49:56 【问题描述】:

您好,我正在尝试创建一个组件,它在控制器中工作正常,但不能将值绑定到视图。

我的组件如下

app.component("bdObjects", 
    templateUrl: "app/templates/components/BusinessObjects.html",

    controller: ["$scope", "$http", "$log", "API_ROOT", "VisDataSet", 
        function ($scope, $http, $log, API_ROOT, VisDataSet) 


        $scope.fnAdd = function() 
            $scope.objectId = "";
            $scope.objectName = "Test Object";
            console.log($scope.objectName);
        

        $scope.cancelAdd = function() 
            if($scope.items.length > 0) 
                $log.info($scope.items[0]);
                $scope.fnPopulateForm($scope.items[0]);
            
        
    ], 

    bindings: 
        data: "=",
        objectId: "=",
        objectName: "="
    
);

我的模板

<div class="general-form">
    <input type="hidden" name="id" ng-model="objectId">
    <label>Name:</label>
    <br>
    <input class="form-control" name="name" placeholder="Name" ng-model="objectName">
    <br>
</div>

所以在添加按钮上,我尝试为输入框赋值。但它没有采取。我想让这两种方式绑定。所以稍后我会有保存按钮,所以更改 TextBox 中的值将在 Controller 中替换。

谢谢。

【问题讨论】:

bindings 将值绑定到控制器实例,而不是 $scope cancelAdd 你有$scope.itemsitems 是否应该是 data 绑定?您应该提供组件的使用方式。 【参考方案1】:

我尝试了 $timeout() 并且它开始工作了。

【讨论】:

【参考方案2】:

在控制器中,将$scope 更改为this 或一些别名,例如

controller: ["$scope", "$http", "$log", "API_ROOT", "VisDataSet", 
    function ($scope, $http, $log, API_ROOT, VisDataSet) 
        var ctrl = this;

        ctrl.fnAdd = function() 
            ctrl.objectId = "";
            ctrl.objectName = "Test Object";
            console.log(ctrl.objectName);
        

        // Not sure about items: you haven't defined it,
        // neither fnPopulateForm...
        ctrl.cancelAdd = function() 
            if(ctrl.items.length > 0) 
                $log.info($scope.items[0]);
                ctrl.fnPopulateForm(ctrl.items[0]);
            
        
    ], 

在视图中,使用默认控制器绑定,即$ctrl

<div class="general-form">
    <input type="hidden" name="id" ng-model="$ctrl.objectId">
    <label>Name:</label>
    <br>
    <input class="form-control" name="name" placeholder="Name" ng-model="$ctrl.objectName">
    <br>
</div>

您还可以在组件的controllerAs 声明中将$ctrl 更改为您想要的任何内容,即

app.component("bdObjects", 
    templateUrl: "app/templates/components/BusinessObjects.html",
    controller: ["$scope", "$http", "$log", "API_ROOT", "VisDataSet", 
        function ($scope, $http, $log, API_ROOT, VisDataSet) 
          //...
    ],
    controllerAs: 'bd', 
    bindings: 
        //...
    
);

在视图中:

【讨论】:

【参考方案3】:

嘿,看看这个JS fiddle

<!DOCTYPE html>
<html>
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>

 <body>
<div ng-app="myApp" ng-controller="namesCtrl">
  <input type="hidden" name="id" ng-model="objectId">
  <label>Name:</label>
  <br>
  <input class="form-control" name="name" placeholder="Name" ng-model="objectName">
  <br>
  <button ng-click="fnAdd()">
    button
  </button>
</div>
<script>
  angular.module('myApp', []).controller('namesCtrl', function($scope) 
    $scope.fnAdd = function() 
      $scope.objectId = "";
      $scope.objectName = "Test Object";
      console.log($scope.objectName);
    


    $scope.cancelAdd = function() 
      if ($scope.items.length > 0) 
        $log.info($scope.items[0]);
        $scope.fnPopulateForm($scope.items[0]);
      
    

  );

</script>

【讨论】:

以上是关于组件绑定不起作用:Angularjs的主要内容,如果未能解决你的问题,请参考以下文章

当绑定项为对象并动态修改时,单向绑定不起作用

范围绑定在模态弹出窗口angularjs中不起作用

当我在 Angularjs 中绑定来自响应的数据时,引导多选不起作用

在 AngularJS + Bootstrap 中添加数据切换属性时,单选按钮绑定不起作用

Select2 for AngularJS 中的两种方式数据绑定不起作用

AngularJS 1.5- ui-router:在状态内调用组件,父级不起作用