5

我正在使用 AngularJS 框架构建一个 HTML 应用程序。我有一些遗留的 JavaScript 操作需要访问 Angular 对象中的函数,但我无法让它工作。
这是 Angular 对象(我需要访问的功能是$scope.info()):

function content($scope) {
    $scope.info = function (id) {
        console.log('Got a call from '+id);
        $scope.text = "Hello, "+id;
    };
}

我试图通过 访问它angular.element('content').scope().info('me'),但没有结果(控制台说undefined)。我试图转储 的结果angular.element('content').scope(),我得到了完整的对象列表和所有内容。从理论上讲,我的第一个示例应该可以工作,但事实并非如此。

非常感谢任何关于我如何实现这一目标的指导!
(PS:从遗留代码调用 Angular JS没有解决这个问题)。


当我终于能够访问该函数时,它并没有按预期工作—— 的值在$scope.text技术上修改了,但 HTML 中使用的表达式没有更新!例如,<p>{{text}}</p>从外部函数调用此函数后不会更新。

有没有什么办法解决这一问题?

4

2 回答 2

24

angular.element()需要一个DOM 元素,所以如果你有这个 html:

<div ng-controller="content">
</div>

并且您想访问其 DOM 元素,请使用 id:

<div id="myDiv" ng-controller="content">
</div>

然后

angular.element($('#myDiv')).scope().info('me')

或者没有 jQuery:

angular.element(document.getElementById('myDiv')).scope().info('me')

应该管用。

编辑:

如果您更改了范围内的某些内容,您可能需要使用$apply()

angular.element(document.getElementById('myDiv')).scope().$apply();
于 2013-01-12T22:21:07.200 回答
0

对我来说,我试图从回调(在另一个窗口中)访问/设置角度的值;解决方案是使用 jQuery 的data方法。dataAPI 允许您将对象文字附加到 DOM 节点。因此,我没有使用诸如全局变量之类的东西(这也可以),而是执行以下操作:

/**
 * Listen to a global "lookupTemplate" event
 */
$j(document).on("lookupTemplate", function(event, template) {
        $j(document).data("template", template);
        window.open("/callbackURL", 'Callback Window', 'status=0,toolbar=0,height=230,width=358');
    });

/**
* Callback from other window, to change template ID and name (it's global)
* @param {String} template_id the ID for the selected template from the other window
* @param {String} template_name the name for the selected template from the other window
*/
function templateChosen(template_id, template_name) {
    var template = $(document).data("template");
    var appendedSelector = "[" + template.index + "]";
    $('[name="templateId' + appendedSelector + '"').val(template_id);
    $('[name="templateName' + appendedSelector + '"').val(template_name);
    // Update angular vars just in case
    template.id = template_id;
    template.name = template_name;
}

var app = angular.module("app", []).controller("ActionsController", function($scope) {
        $scope.actions = [];
        $scope.lookupTemplate = function(index) {
            $scope.actions[index].template.index = index;
            $(document).trigger("lookupTemplate", $scope.actions[index].template);
        }
    }
);

我使用 Angular 中包含的helper增加name每个 new 的属性。action{{index}}

于 2014-12-10T23:56:28.520 回答