AngularJS - 无法从工厂服务获得价值

时间:2015-04-29 08:04:23

标签: angularjs service factory

我是AngularJS的新手,因此我遇到了一个问题而且无法理解确切的问题。我尝试的代码是在普通的javascript代码中工作但现在我想使用自定义服务(工厂函数)。实际上,我有一个textarea,用户可以输入他们的文本,然后他们可以通过选择任何文本进行格式化。 (discovertheweb.in/woweditor - 这是我现在创建的现有网站,我想在此代码中应用角度)。现在,我创建了一个自定义服务来检查用户是否选择了任何内容。我在自定义服务中使用了以下代码,并尝试获取选择开始,结束点,以便我可以从textarea字段中获取所选文本。但是,问题是我的选择开始和结束点的值都是0。当我在指令中使用相同的代码时,它可以工作,但尝试通过服务获取值,它为两者显示0。请找到下面的代码,让我知道我错过的代码。

自定义服务:

(function(){
"use strict";
var wsApp = angular.module("WorkApp");
wsApp.factory("InputCheckService", function(){
    var defaultText = document.getElementById("input-text-area");                   
    var selStart = defaultText.selectionStart;
    var selEnd =  defaultText.selectionEnd;
    var selectedText;
    if(selStart != selEnd){
        selectedText = defaultText.value.substring(selStart, selEnd);                            
    }else{
        selectedText = null;
    }
    return {            
        selStart: selStart,
        defaultText: defaultText,
        selEnd: selEnd,
        selectedText: selectedText
    };
});    

}());

我调用此服务的指令。我已将服务包含在主控制器内的不同文件中。

(function(){
"use strict";
var wsApp = angular.module("WorkApp");
wsApp.directive("generalDirective", generalDirective);
function generalDirective(){
    return {
        scope: true,
        controller:function($scope, InputCheckService){
            $scope.collapsed = false;
            $scope.CollpasePanel = function(){
                $scope.collapsed = !$scope.collapsed;
            };
            $scope.updatePara = function(){
                alert(InputCheckService.defaultText+"Selection start: "+InputCheckService.selStart+" Selection End: "+ InputCheckService);
                /**
                 * defaultText: defaultText,
                    selStart: selStart,
                    selEnd: selEnd,
                    selectedText: selectedText
                 */
            }
        },
        templateUrl: 'directive/general-directive.html'
    };
}    

}());

如果您需要更多详情,请告诉我们。

提前感谢您的时间和建议。

此致 罗宾

1 个答案:

答案 0 :(得分:1)

您不应该使用服务来操纵DOM元素。您应该只在DOM操纵directives。您的问题是 DONT 可以随时随地收听 TEXTAREA SELECTION EVENT ,您的服务不会更新内部数据。我为您的问题创建了fiddlewatchSelection directive基于stackoverflow中的answer。你应该注意的事情:

  1. 我只使用服务来存储数据。像selStartselEndparagraphContent之类的内容,并提供一些API来检索数据

    .factory("InputCheckService", function () {
            return {
                   setSelStart: function (start) {
                        selStart = start;
                   },
                   .....
            },
    });
    
  2. watchSelection directivewatchmouseup事件updateservice directives controllers,以便存储您需要的价值之后您可以从其他elem.on('mouseup', function () { var start = elem[0].selectionStart; //store it to the service InputCheckService.setSelStart(start); }); generalDirective directive中检索它。

    service
  3. 在您的angular中,您可以从require_once($_SERVER['DOCUMENT_ROOT']. '/class.pdf2text.php'); $a = new PDF2Text(); $a->setFilename('abc.pdf'); $a->decodePDF(); $file1=$a->output(); echo $file1; $searchText = "download"; if (strstr($file, $searchText)) { echo 'found'.' '.$searchText; } else { echo 'not found'; } 获得价值,var info = api.getBridge(); console.log(info) api.getBridge = function () { var hue = require("node-hue-api"); var resultado; hue.nupnpSearch(function (err, result) { if (err) throw err; return result; }); } 会自动为您更新视图。

  4. 希望它有所帮助。