2016-10-23 43 views
0

我想要獲得我的角度控制器中的值和屬性,但它是undefined。如果它有助於MVC.net應用程序中的所有內容。無法獲得html標籤的角度屬性

簡化代碼:

TestCtrl.js:

angular.module('CMM') 
    .controller('TestCtrl', ['$scope', '$element', '$attrs', function ($scope, elem, $attrs) { 
     $scope.name = "mohsen"; 
     $scope.api = $attrs.api; 
     alert($attrs.api); 
     alert(elem.data('api')); 
     console.log('hi, I am here'); 
    }]); 

app.js:

var app = angular.module('CMM', ['ngRoute','slServices', 'slControllers', 'ngAnimate', 'smart-table', 'ui.bootstrap']); 
..... 

用法:

<div id="content" ng-controller="TestCtrl"> 
    <h3> 
     <input type ="text" ng-model="name"/> 
     <input type="text" ng-model="api" api="/sl/asdf"/> 
     .... 
+0

唯一的元素將被暴露的方式是,如果你的控制器是*「組件」的一部分*或「」指令「*。在正常的控制器中你根本不應該關心什麼是dom。閱讀ngModel文檔 – charlietfl

+0

你能否解釋一下你想要完成什麼?不應該使用控制器來與DOM交互;這就是你對一個指令所做的事情。指令可以公開和/或使用控制器,因此這可能是您需要做的事情,但是如果您可以提供更多詳細信息,則會更容易提出建議。 –

+0

@charlietfl我想將指令模板中的api地址傳遞給控制器​​。所以我只是在這裏測試它。 – mok

回答

1

由於$element$attrs不可注射,因此您的代碼不能按照書面方式工作。如註釋中所述,您可以使用指令來訪問屬性並從指令中引用控制器。這不是真正做到這一點的正確方法,但可以使其工作。

所以,你的控制器可能暴露,用於向它提供從該指令的API值的方法,如:

.controller("TestCtrl", function ($scope) { 
    this.SetApi = function (api) { 
    $scope.api = api; 
    }; 
}) 

而且你的指令可以參考控制器和調用提供值的方法,像這樣:

.directive("getApi", function() { 
    return { 
    controller: "TestCtrl", 
    link: function (scope, element, attr, controller) { 
     controller.SetApi(attr.api); 
    } 
    }; 
}); 

這裏是一個工作示例:https://jsfiddle.net/n5t6pfcc/

+0

謝謝,它的工作更重要,現在我更瞭解這個機制。順便說一句,如果您提供鏈接或簡要解釋爲什麼這些服務不可注射,那將是非常好的。 – mok