抽象

我正在开发一个应用程序,使用角度作为一个客户端框架,角度当前岩石,我真的很高兴使用它,虽然现在我发现我使用了很多复制和粘贴代码,我想组织成类层次。例如对话框共享一组通用的功能,他们需要被打开,关闭,提供typahead功能的代码也是从一些父BaseTypeaheadClass继承的第一个候选人,虽然一个我没有找到在角度是一个标准的方式组织这些层次结构。两个控制器,服务,提供者使用普通的javascript函数下面可以通过原型的方式扩展,所以我的问题是:

什么是组织我的类函数的角度方式,有什么标准机制,将允许从另一个派生一个类

P.S。

我猜这个问题:

>定义基类的实现作为服务,因此它们将很容易注入任何控制器或其他需要该特定类的服务
>定义OOP服务,并提供将用于创建基础/派生类的方法,如define,derived等

谢谢,

编辑

从我开始问我的问题的时间过去了一段时间。从那时起,我已经出来了方法,我成功地使用在几个项目,我非常喜欢,想与大家分享。

目前angular不提供任何用于组织类层次结构的构造,并且很遗憾,因为或多或少的大应用程序不能满足只有Model / View / Controller / …结构,它必须将它的代码组织成OOP对象。

我在网络开发领域已经工作了很长时间,我还没有看到一个企业项目,大量利用JavaScript的OOP。我看到的是巨大的,良好的组织的服务器端/数据库侧的逻辑接近无限的javascript意粉润滑脂动物园的框架和库在客户端。

没有MVVM,MVP框架,如knockout.js,骨干,其他…能够取代OOP本身。如果你不使用定向编程的核心原则,如类,对象,继承,抽象,多态性,你是在深处,你会得到一个巨大的长javascript的意大利面。

关于Angular我认为它是一个框架非常不同于knockout.js / backbone.js /任何其他MVV任何框架,但根据我的实践也不是一个银弹能够取代OOP。当我试图不使用OOP与Angular I结束了重复逻辑大多在控制器。不幸的是没有(我没有发现没有)干净和有角度的方式打那个问题。

但我已成功(我认为)解决了这个问题。

我使用紧凑,zerro依赖性lib,只是实现了John Resig的Simple JavaScript Inheritance(https://github.com/tracker1/core-js/blob/master/js-extensions/040-Class.js)。在这个库的帮助下,我能够创建/继承/创建抽象方法/覆盖它们,换句话说,做我在服务器端习惯的一切。

这里是一个使用示例:

Application.factory('SomeChildobject',['$http','SomeParentClass',function ($http,SomeParentClass) {
    var SomeChildClass = SomeParentClass.extend({
        init: function() { // Constructor
            this._super.init(123,231); // call base constructor
        },someFunction: function() {
            // Notice that your OOP Now kNows everything that can be injected into angular service,which is pretty cool :)
            $http({method: 'GET',url: '/someUrl'}).then(function(){
                this._super.someFunction(); // call base function implementation
            });
        }
    });

    // return new SomeChildClass(); // We are not returning instance here!

    return SomeChildClass; // Service is a function deFinition not an instance of an object
}]);

// So Now we can both use this service in angular and have the ability to extend it using the `extend` method call,like so:
Application.controller('MegaController',['$scope','SomeChildClass',function ($scope,SomeChildClass) {
    $scope.someObject = new SomeChildClass();
}]);

OOP角度游戏一起非常好,在角度上下文创建的对象可以利用通过服务自动依赖注入,所以你不必注入实例到你的OOP构造函数,这个事实使你的OOP层次结构非常苗条,没有不相关的东西,需要(和是)由angular.js处理

所以玩这种方法,并提供反馈在这里与您获得的结果或您遇到的问题,

谢谢,

另一个编辑

最近我已经遇到了很少的原始Class.js实现的问题,如下所示:

1)如果你将一个对你的实例方法的引用传递给其他方法的回调,这些方法可能不会按你期望的方式工作。他们会放弃参考。在这种情况下,你会期望看到你的当前对象在这里,但它将是顶级窗口或一些其他上下文对象,这取决于回调如何调用你的方法。它发生是由于JavaScript架构。为了解决这个问题,提供了一个特殊的ClassMember函数,指示Class在创建时将方法绑定到对象上下文(查看下面的使用进一步的指导)。

2)显然原始的Class.js实现不知道有关角度类型的控制器方法声明。

Class.extend('YourClassdisplayName',{
    ctor: function () {
        // Some useful constructor logic
    },controller: ['$scope','$attrs',$attrs) {
        // Do smth. with $scope and $attrs
    }]
});

当前实现理解上述语法

3)当使用上面的方法没有适当的处理它会打破角度$$注释的过程,所以参考上面的例子,将不可能注入$ scope和$ attrs到ClassMember方法,或overriden方法,使用this.base …)。所以这也是固定的。

诀窍:

1)当在异步操作处理程序(类似$ http.get(…,function(){self.base(…);})中使用this.base(…)时请注意this.base (…)调用有一个有限的生命周期,一旦方法返回this.base(…)停止现有。因此,如果您计划以异步方式调用基本方法,则应明确保存对基本方法的引用。即:

...
var self = this;
var base = this.base;
...
$http.get(...,function () {
    base.call(self,...); // or base.apply(self,...),or base() if you don't care about `this`
})

我已经解决了所有上述问题(除了一个gotcha,由于JavaScript架构无法解决),并希望与大家分享,希望你会从中受益:

/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 *
 * Inspired by base2 and Prototype

 * Angular adaptations by Denis Yaremov http://github.com/lu4
 * Usage:
 ---------------------------------

   var X = Class.extend('X',{
       ctor: function () {
           this.name = "I'm X";
       },myOrdinaryMethod: function (x,y,z) {
           console.log([this.name,x,z]);
       },myClassMemberMethod: ClassMember(function (x,z]);
       })
   });

   var Y = Class.extend('Y',{
       ctor: function () {
           this.name = "I'm Y";
       },z]);
       })
   });

   var x = new X();
   var y = new Y();

   x.myClassMemberMethod('a','b','c'); // ["I'm X","a","b","c"] 
   y.myClassMemberMethod('u','v','m'); // ["I'm Y","u","v","m"] 

   x.myOrdinaryMethod('a',"c"] 
   y.myOrdinaryMethod('u',"m"] 

   y.theirOrdinaryMethod = x.myOrdinaryMethod;
   y.theirClassMemberMethod = x.myClassMemberMethod;

   y.theirOrdinaryMethod('a','c'); // ["I'm Y","c"] 
   y.theirClassMemberMethod('u','m'); // ["I'm X","m"]

*/

angular.module('app').factory('ClassMember',function () {
    return function ClassMember(fn) {
        if (this instanceof ClassMember) {
            this.fn = fn;
        } else {
            return new ClassMember(fn);
        }
    };
});

angular.module('app').factory('Class',function (ClassMember) {
    var runtime = { initializing: false },fnTest = /xyz/.test(function() { xyz; }) ? /\bbase\b/ : /.*/,FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m,STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;

    var toString = Object.prototype.toString;

    // The base Class implementation (does nothing)
    function Class() { };

    Class.members = { };

    // Create a new Class that inherits from this class
    Class.extend = function extend(displayName,properties) {
        var array;

        var targetMembers = {};
        var sourceMembers = this.members;

        for (var memberName in sourceMembers) {
            if (sourceMembers.hasOwnProperty(memberName)) {
                targetMembers[memberName] = sourceMembers[memberName];
            }
        }

        var base = this.prototype;

        // Instantiate a base class (but only create the instance,// don't run the ctor constructor)
        runtime.initializing = true;
        var prototype = new this();
        runtime.initializing = false;

        // copy the properties over onto the new prototype
        for (var name in properties) {
            if (properties.hasOwnProperty(name)) {
                // Check if we're overwriting an existing function
                var property = properties[name];

                // Support angular's controller/service/factory declaration notation
                if (toString.call(property) === '[object Array]') {
                    array = property;

                    var item = array[array.length - 1];

                    if (toString.call(item) === '[object Function]' || item instanceof ClassMember) {
                        property = array[array.length - 1];
                    } else {
                        array = null;
                    }
                } else {
                    array = null;
                }

                var isClassMember = property instanceof ClassMember;

                if (isClassMember) {
                    property = property.fn;
                }

                if (typeof property === "function") {
                    if (typeof base[name] === "function" && fnTest.test(property)) {
                        property = (function (propertyName,fn) {
                            var args = fn.toString().replace(STRIP_COMMENTS,'').match(FN_ARGS)[1];
                            return (new Function('propertyName','fn','base','return function (' + args + ') {\n\
                                    var prevBase = this.base;\n\
                                    var hasBase = "base" in this;\n\
\n\
                                    // Add a new .base() method that is the same method\n\
                                    // but on the super-class\n\
\n\
                                    this.base = base[propertyName];\n\
\n\
                                    // The method only need to be bound temporarily,so we\n\
                                    // remove it when we\'re done executing\n\
                                    var ret = fn.call(this' + (!!args ? (',' + args) : args) + ');\n\
\n\
                                    if (hasBase) {\n\
                                        this.base = prevBase;\n\
                                    } else {\n\
                                        delete this["base"];\n\
                                    }\n\
                                    return ret;\n\
                                }'))(propertyName,fn,base);
                        })(name,property);
                    }

                    if (isClassMember) {
                        targetMembers[name] = property;
                    } else if (name in targetMembers) {
                        delete targetMembers[name];
                    }

                    if (array) {
                        array[array.length - 1] = property;

                        property = array;
                    }

                    prototype[name] = property;
                } else {
                    prototype[name] = property;
                }
            }
        }

        var membersArray = [];
        for (var i in targetMembers) {
            if (targetMembers.hasOwnProperty(i)) {
                membersArray.push({ name: i,fn: targetMembers[i] });
            }
        }

        // All construction is actually done in the ctor method
        var ChildClass = (new Function("runtime","members","FN_ARGS","STRIP_COMMENTS","return function " + (displayName || "Class") + "() {\n\
            if (!runtime.initializing && this.ctor)\n\
            {\n\
                var length = members.length;\n\
                for (var i = 0; i < length; i++)\n\
                {\n\
                    var item = members[i];\n\
                    this[item.name] = (function (me,fn) {\n\
                        var args = fn.toString().replace(STRIP_COMMENTS,'').match(FN_ARGS)[1];\n\
                        return args ? (new Function('me','return function (' + args + ') { return fn.call(me,' + args + '); }'))(me,fn) : function () { return fn.call(me); };\n\
                    })(this,item.fn);\n\
\n\
                }\n\
                this.ctor.apply(this,arguments);\n\
            }\n\
        }"))(runtime,membersArray,FN_ARGS,STRIP_COMMENTS);

        ChildClass.members = targetMembers;

        // Populate our constructed prototype object
        ChildClass.prototype = prototype;

        // Enforce the constructor to be what we expect
        ChildClass.prototype.constructor = ChildClass;

        // And make this class extendable
        ChildClass.extend = extend;

        return ChildClass;
    };

    return Class;
});

另一个编辑

最后,我偶然发现了另一个与原始的John Resig相关的角度相关的问题,这个问题与angular的注解过程(用于依赖注入)有关,它使用Function.prototype.toString()和一些Regex’es提取依赖的名称的目的。原始实现的问题是它不期望这样,所以你不能声明接受依赖的方法,所以我已经调整了实现一点处理以前描述的问题,这里是:

/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 *
 * Inspired by base2 and Prototype

 * Angular adaptations by Denis Yaremov http://github.com/lu4
 * Usage:
 ---------------------------------

   var X = Class.extend('X',"m"]

*/


angular.module('homer').factory('Class',function () {
    function ClassMember(fn) {
        if (this instanceof ClassMember) {
            this.fn = fn;
            return this;
        } else {
            return new ClassMember(fn);
        }
    }

    function ClassEvent() {
        if (this instanceof ClassEvent) {
            return this;
        } else {
            return new ClassEvent();
        }
    }

    var runtime = { initializing: false },fnTest = /xyz/.test(function () { xyz; }) ? /\bbase\b/ : /.*/,fnArgs = /^function\s*[^\(]*\(\s*([^\)]*)\)/m,stripComments = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;

    var toString = Object.prototype.toString;

    // The base Class implementation (does nothing)
    function Class() { };

    Class.events = {};
    Class.members = {};

    // Create a new Class that inherits from this class
    Class.extend = function Extend(displayName,properties) {
        var array;

        var targetEvents = {};
        var sourceEvents = this.events;

        var targetMembers = {};
        var sourceMembers = this.members;

        for (var eventName in sourceEvents) {
            if (sourceEvents.hasOwnProperty(eventName)) {
                targetEvents[eventName] = sourceEvents[eventName];
            }
        }

        for (var memberName in sourceMembers) {
            if (sourceMembers.hasOwnProperty(memberName)) {
                targetMembers[memberName] = sourceMembers[memberName];
            }
        }

        var base = this.prototype;

        // Instantiate a base class (but only create the instance,// don't run the ctor constructor)
        runtime.initializing = true;
        var prototype = new this();
        runtime.initializing = false;

        // copy the properties over onto the new prototype
        for (var name in properties) {
            if (properties.hasOwnProperty(name)) {
                // Check if we're overwriting an existing function
                var property = properties[name];

                // Support angular's controller/service/factory declaration notation
                if (toString.call(property) === '[object Array]') {
                    array = property;

                    var item = array[array.length - 1];

                    if (toString.call(item) === '[object Function]' || item instanceof ClassMember) {
                        property = array[array.length - 1];
                    } else {
                        array = null;
                    }
                } else {
                    array = null;
                }

                var isClassMember = property instanceof ClassMember;

                if (isClassMember) {
                    property = property.fn;
                }

                var isClassEvent = property instanceof ClassEvent;

                if (isClassEvent) {
                    property = (function() {
                        function Subscriber(fn) {
                            Subscriber.listeners.push(fn.bind(this));
                        };

                        Subscriber.listeners = [];
                        Subscriber.fire = function() {
                            var listeners = Subscriber.listeners;

                            for (var i = 0; i < listeners.length; i++) {
                                var result = listeners[i].apply(this,arguments);

                                if (result !== undefined) return result;
                            }

                            return void 0;
                        }

                        return Subscriber;
                    })();
                }

                if (typeof property === "function") {
                    if (typeof base[name] === "function" && fnTest.test(property)) {
                        property = (function (propertyName,fn) {
                            var args = fn.toString().replace(stripComments,'').match(fnArgs)[1];
                            return (new Function('propertyName',property);
                    }

                    if (isClassEvent) {
                        targetEvents[name] = property;
                    } else {
                        delete targetEvents[name];
                    }

                    if (isClassMember) {
                        targetMembers[name] = property;
                    } else if (name in targetMembers) {
                        delete targetMembers[name];
                    }

                    if (array) {
                        array[array.length - 1] = property;

                        property = array;
                    }

                    prototype[name] = property;
                } else {
                    prototype[name] = property;
                }
            }
        }

        var eventsArray = [];
        for (var targetEventName in targetEvents) {
            if (targetEvents.hasOwnProperty(targetEventName)) {
                eventsArray.push({ name: targetEventName,fn: targetEvents[targetEventName] });
            }
        }

        var membersArray = [];
        for (var targetMemberName in targetMembers) {
            if (targetMembers.hasOwnProperty(targetMemberName)) {
                membersArray.push({ name: targetMemberName,fn: targetMembers[targetMemberName] });
            }
        }

        // All construction is actually done in the ctor method
        var ChildClass = (new Function("runtime","events","return function " + (displayName || "Class") + "() {\n\
            if (!runtime.initializing && this.ctor)\n\
            {\n\
                var length = members.length;\n\
                var bind = function (me,$$fn$$) {\n\
                    var args = $$fn$$.toString().replace(STRIP_COMMENTS,'').match(FN_ARGS)[1];\n\
                    var result = args ? (new Function('me','$$fn$$','return function (' + args + ') { return $$fn$$.apply(me,arguments); }'))(me,$$fn$$) : function () { return $$fn$$.apply(me,arguments); };\n\
                    return result;\n\
                };\n\
                for (var i = 0; i < length; i++)\n\
                {\n\
                    var item = members[i];\n\
                    var fn = item.fn;\n\
                    var name = item.name;\n\
                    var property = this[name] = bind(this,fn);\n\
                    if (fn.fire) {\n\
                        property.fire = bind(this,fn.fire);\n\
                    }\n\
                    if (fn.listeners) {\n\
                        property.listeners = fn.listeners;\n\
                    }\n\
                }\n\
                \n\
                var length = events.length;\n\
                for (var i = 0; i < length; i++)\n\
                {\n\
                    var item = events[i];\n\
                    var fn = item.fn;\n\
                    var name = item.name;\n\
                    var property = this[name] = bind(this,fn.fire);\n\
                    }\n\
                    if (fn.listeners) {\n\
                        property.listeners = fn.listeners;\n\
                    }\n\
                }\n\
                this.ctor.apply(this,eventsArray,fnArgs,stripComments);

        ChildClass.members = targetMembers;

        // Populate our constructed prototype object
        ChildClass.prototype = prototype;

        // Enforce the constructor to be what we expect
        ChildClass.prototype.constructor = ChildClass;

        // And make this class extendable
        ChildClass.extend = Extend;
        ChildClass.event = ClassEvent;
        ChildClass.member = ClassMember;

        return ChildClass;
    };

    Class.member = ClassMember;
    Class.event = ClassEvent;

    return Class;
});
你的猜测听起来完全适用。

您可以通过简单地调用附加到父作用域的方法来重用父控制器中定义的功能:

HTML

<div ng-controller="ParentCtrl">
    <!-- Something here ... -->
    <div ng-controller="ChildCtrl">
        <!-- Something here ... -->
    </div>
    <!-- Something here ... -->
</div>

JavaScript

function ParentCtrl($scope) {
    $scope.parentMethod = function () {
        //method body
    };
}

function ChildCtrl($scope) {
    $scope.childMethod = function () {
        //functionality
        $scope.parentMethod();
        //functionality
    };
}

如果你想使用JavaScript方法与原型继承,你可以使用:

var myApp = angular.module('myApp',[]);

function Parent($scope) {
    $scope.name = 'Superhero';    

    $scope.clickParent = function() {
        $scope.name = 'Clicked from base controller';
    }    
}

function Child($scope,$injector) {

    debugger;
    $injector.invoke(Parent,this,{$scope: $scope});

    $scope.name = 'Superhero Child';

    $scope.clickChild = function(){
        $scope.clickParent();
    }       
}
Child.prototype = Object.create(Parent.prototype);

http://jsfiddle.net/mhevery/u6s88/12/

对于服务,例如,您可以使用:

(function () {

function ParentService(arg1) {
   this.arg1 = arg1;
}

function ChildService(arg1,arg2) {
   ParentService.call(this,arg1);
   this.arg2 = arg2;
}

ChildService.prototype = new ParentService();

app.service('ChildService',ChildService);

}());

还检查this讨论和blog post about inheritance in AngularJS我贴。

angularjs与oop继承在行动的更多相关文章

  1. 使用xib创建自定义视图

    但是,您必须接受您的XIB将包含根视图或其他内容,这些视图将作为子视图添加到放入Placement的类的实例中.这样,你应该有类似的东西:XIB与您的自定义视图内容:添加XIB的位置:由于添加到展示位置的视图实例与XIB中的文件所有者相同,因此您可以在XIB和Placement中设置出口和操作.只是不要忘记你的XIB中的根视图不是UIKit将创建放置到Placement的实例.为方便起见,请在下面找到我的代码,该代码是基类,以便于创建此类视图:

  2. xamarin.ios – 没有找到ViewController ::.ctor(System.IntPtr)的构造函数

    我有一个问题,我的Monotouch应用程序有时在收到内存警告后才会崩溃.请参见下面的堆栈跟踪.堆栈跟踪是正确的,因为指定的类缺少构造函数获取IntPtr参数.但是这是有意的,因为我在应用程序中根本不使用InterfaceBuilder.那为什么会这样呢?

  3. iOS8 / Swift和MobileVLCKit构建失败

    我正在努力用MobileVLCKit和cocoapods构建我的项目.在不添加任何VLCKit代码的情况下,我在模拟器或设备上构建应用程序时会出错.Pod文件:这是我得到的错误我的部署目标是8.0.我在Debug中将“BuildActiveArchitectureOnly”设置为YES.非常感谢你的帮助!解决方法除了做MukeshThawani所说的话;ChangeC++StandardLibra

  4. swift runtime type

    varv=1.0;println(v.dynamicType);//Swift.Double

  5. runTime(二)

    我们前面已经讲过一篇runtime原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!首先,第一个问题,1》runtime实现的机制是什么,怎么用,一般用于干嘛?在我们平时编写的OC代码中,程序运行过程时,其实最终都是转成了runtime的C语言代码,runtime算是OC的幕后工作者比如说,下面一个创建对象的方法中,举例:OC:第二个问题runtime用来干什么呢??..这是我们学习runtime必须知道的函数!

  6. swift之用runtime实现字典转模型

    6、未完成的事情当类的属性与字典里的key值不一定的时候,出现的情况:字典里面的key是关键字的时候当类的属性是数组,并且数组里面要放自定义类的时候接着完成未完成的事情,首先当字典里的key值与属性不一致的时候,我弄了个映射一、解决类的属性与字典里的key值不一定的情况二、首先我们添加一个方法,这个方法的作用是把字典数组转成模型数组。

  7. Swift &amp; the Objective-C Runtime

    Swift&theObjective-CRuntimeWrittenbyNateCook—January26th,2015EvenwhenwrittenwithoutasinglelineofObjective-Ccode,everySwiftappexecutesinsidetheObjective-Cruntime,openingupaworldofdynamicdispatchandasso

  8. Swift 调用 objc/runtime OBJC_ASSOCIATION_RETAIN

    我扩展一些类在Swift2.0工作与ReactiveCocoa3.0,但遇到了一些问题。我跟随科林·艾伯哈特的教程,和有复制粘贴一些他UIKit扩展逻辑结束对我的OSX应用程序。它所有的编译很好,除了此属性:UInt,这给了我以下的编译器错误。使用的未解析的标识符如何访问此属性?我一直对importObjectiveC和#import头文件,但没有什么似乎工作。解决方法1:这是实际上现在导入Swift作为枚举命名为objc_AssociationPolicy。或与枚举速记语法。

  9. Swift 中的 Runtime

    即使在SwiftAPP中没有一行Object-c的代码,每个APP也都会在Object-cruntime中运行,为动态任务分发和运行时对象关联开启了一个世界。更确切地说,可能在仅使用Swift库的时候只运行Swiftruntime。但是使用Objective-Cruntime这么长时间,我们也应该让他充分发挥其作用。方法交叉发生在initialize类方法调用时;替代的实现在nsh_viewWillAppear方法中:loadvs.initializeObjective-Cruntime理论上会在加载和初

  10. Swift是否和OC一样有runtime机制

    Swift是否和OC一样有runtime机制OC语言最大的特性无疑是其的动态性,可以利用OC的动态性能够获得一个类的方法和属性,从而实现灵活的程序,但Swift是否也包含了runtime机制呢?对于TestSwiftClass来说除testReturnTuple、testReturnVoidWithaCharacter两个方法外,其他的都获取成功了。可以知道@objc是用来将Swift的API导出给Objective-C和Objective-Cruntime使用的,如果你的类继承自Objective-c的

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部