javascript

java

python

c#

android

c++

node.js

php

html

jquery

reactjs

ios

css

.net

git

ruby-on-rails

sql

c

string

ruby

javascript-如何使用茉莉花测试具有setTimeout的函数?

我需要为内部有jasmine.Clock.useMock();调用的函数编写测试,但是我找不到应该怎么做。

这是功能

// Disables all submit buttons after a submit button is pressed.
var block_all_submit_and_ajax = function( el ) {
    // Clone the clicked button, we need to know what button has been clicked so that we can react accordingly
    var $clone = $( el ).clone();
    // Change the type to hidden
    $clone.attr( 'type', 'hidden' );
    // Put the hidden button in the DOM
    $( el ).after( $clone );
    // Disable all submit button. I use setTimeout otherwise this doesn't work in chrome.
    setTimeout(function() {
         $( '#facebook input[type=submit]' ).prop( 'disabled', true );
     }, 10);
    // unbind all click handler from ajax
    $( '#facebook a.btn' ).unbind( "click" );
    // Disable all AJAX buttons.
    $( '#facebook a.btn' ).click( function( e ) {
        e.preventDefault();
        e.stopImmediatePropagation();
    } );
};

这是我的考验

it( "Disable all submit buttons", function() {
    // Get a button
    var $button = $( '#ai1ec_subscribe_users' );
    // Call the function
    utility_functions.block_all_submit_and_ajax( $button.get(0) );
    // check that all submit are disabled
    $( '#facebook input[type=submit]' ).each( function( i, el ) {
        console.log( 'f' );
        expect( el ).toHaveProp( 'disabled', true );
    } );
} );

我尝试使用jasmine.Clock.useMock();jasmine.Clock.tick(11);,但我无法正常工作,测试从未通过

trans by 2020-08-03T18:41:10Z

因果启动无法找到模块“茉莉花芯”

运行“业力启动”时出现以下错误

module.js:340 犯错 ^ 错误:找不到模块“茉莉花芯” 在Function.Module._resolveFilename(module.js:338:15) 在Function.require.resolve(module.js:384:19) 在initJasmine(/usr/lib/node_modules/karma-jasmine/lib/index.js:8:42) 在Array.invoke上[为0](/usr/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15) 在获取时(/usr/lib/node_modules/karma/node_modules/di/lib/injector.js:48:43) 在/usr/lib/node_modules/karma/lib/server.js:137:20 在Array.forEach(本机) 在Server._start(/usr/lib/node_modules/karma/lib/server.js:136:21) 在调用时(/usr/lib/node_modules/karma/node_modules/di/lib/injector.js:75:15) 在Server.start(/usr/lib/node_modules/karma/lib/server.js:101:18) 在Object.exports.run(/usr/lib/node_modules/karma/lib/cli.js:231:26) 在对象。 (/ usr / lib / node_modules / karma / bin / karma:3:23) 在Module._compile(module.js:456:26) 在Object.Module._extensions..js(module.js:474:10) 在Module.load(module.js:356:32) 在Function.Module._load(module.js:312:12)

有人知道为什么会这样吗? 我在VM中运行业力。 我尝试了几个npm install命令,但没有任何效果。 当我关闭机器一整夜后,第二天又回来了,问题消失了,一切又恢复了。 因此,我不再被阻止。任何人都对可能发生的事情有一些想法?

trans by 2020-07-30T06:53:07Z

javascript-在Jasmine的Mock C中使用$ timeout的单元测试Angular Service

我的一个角度服务中有一个函数,希望以固定的间隔重复调用一次。 我想使用$ timeout做到这一点。 看起来像这样:

var interval = 1000; // Or something

var _tick = function () {
     $timeout(function () {
        doStuff();
        _tick();
    }, interval);
};

_tick();

目前,我很困惑如何与Jasmine进行单元测试-我该怎么做? 如果我使用$timeout.flush(),则函数调用会无限期地发生。 如果我使用Jasmine的模拟时钟,则$timeout似乎不受影响。 基本上,如果我可以完成这项工作,那我应该很好:

describe("ANGULAR Manually ticking the Jasmine Mock Clock", function() {
    var timerCallback, $timeout;

    beforeEach(inject(function($injector) {
        $timeout = $injector.get('$timeout');
        timerCallback = jasmine.createSpy('timerCallback');
        jasmine.Clock.useMock();
    }));

    it("causes a timeout to be called synchronously", function() {
        $timeout(function() {
            timerCallback();
        }, 100);
        expect(timerCallback).not.toHaveBeenCalled();
        jasmine.Clock.tick(101);
        expect(timerCallback).toHaveBeenCalled();
    });
});

这两种变体有效,但对我没有帮助:

describe("Manually ticking the Jasmine Mock Clock", function() {
    var timerCallback;

    beforeEach(function() {
        timerCallback = jasmine.createSpy('timerCallback');
        jasmine.Clock.useMock();
    });

    it("causes a timeout to be called synchronously", function() {
        setTimeout(function() {
            timerCallback();
        }, 100);
        expect(timerCallback).not.toHaveBeenCalled();
        jasmine.Clock.tick(101);
        expect(timerCallback).toHaveBeenCalled();
    });
});

describe("ANGULAR Manually flushing $timeout", function() {
    var timerCallback, $timeout;

    beforeEach(inject(function($injector) {
        $timeout = $injector.get('$timeout');
        timerCallback = jasmine.createSpy('timerCallback');
    }));

    it("causes a timeout to be called synchronously", function() {
        $timeout(function() {
            timerCallback();
        }, 100);
        expect(timerCallback).not.toHaveBeenCalled();
        $timeout.flush();
        expect(timerCallback).toHaveBeenCalled();
    });
});

提前致谢!

trans by 2020-07-29T13:05:07Z

javascript-AngularJS +茉莉花:比较对象

我刚刚开始为AngularJS应用编写测试,并且正在Jasmine中进行测试。

以下是相关的代码段

ClientController:

'use strict';

adminConsoleApp.controller('ClientController',
    function ClientController($scope, Client) {

        //Get list of clients
        $scope.clients = Client.query(function () {
            //preselect first client in array
            $scope.selected.client = $scope.clients[0];
        });

        //necessary for data-binding so that it is accessible in child scopes.
        $scope.selected = {};

        //Current page
        $scope.currentPage = 'start.html';

        //For Client nav bar
        $scope.clientNavItems = [
            {destination: 'features.html', title: 'Features'},
        ];

        //Set current page
        $scope.setCurrent = function (title, destination) {
            if (destination !== '') {
                $scope.currentPage = destination;
            }

        };

        //Return path to current page
        $scope.getCurrent = function () {
            return 'partials/clients/' + $scope.currentPage;
        };

        //For nav bar highlighting of active page
        $scope.isActive = function (destination) {
            return $scope.currentPage === destination ? true : false;
        };

        //Reset current page on client change
        $scope.clientChange = function () {
            $scope.currentPage = 'start.html';
        };
    });

ClientControllerSpec:

'use strict';

var RESPONSE = [
    {
        "id": 10,
        "name": "Client Plus",
        "ref": "client-plus"
    },
    {
        "id": 13,
        "name": "Client Minus",
        "ref": "client-minus"
    },
    {
        "id": 23805,
        "name": "Shaun QA",
        "ref": "saqa"
    }
];

describe('ClientController', function() {

    var scope;

    beforeEach(inject(function($controller, $httpBackend, $rootScope) {
        scope = $rootScope;
        $httpBackend.whenGET('http://localhost:3001/clients').respond(RESPONSE);
        $controller('ClientController', {$scope: scope});
        $httpBackend.flush();
    }));

    it('should preselect first client in array', function() {
        //this fails.
        expect(scope.selected.client).toEqual(RESPONSE[0]);
    });

    it('should set current page to start.html', function() {
        expect(scope.currentPage).toEqual('start.html');
    });
});

测试失败:

Chrome 25.0 (Mac) ClientController should preselect first client in array FAILED
    Expected { id : 10, name : 'Client Plus', ref : 'client-plus' } to equal { id : 10, name : 'Client Plus', ref : 'client-plus' }.
    Error: Expected { id : 10, name : 'Client Plus', ref : 'client-plus' } to equal { id : 10, name : 'Client Plus', ref : 'client-plus' }.
        at null.<anonymous> (/Users/shaun/sandbox/zong-admin-console-app/test/unit/controllers/ClientControllerSpec.js:43:39) 

有谁知道为什么会发生这种情况吗?

另外,由于我是刚开始编写AngularJS测试,因此欢迎对我是将测试设置错误还是可以改进的任何评论。

更新:

包括ClientService:

'use strict';

AdminConsoleApp.services.factory('Client', function ($resource) {
    //API is set up such that if clientId is passed in, will retrieve client by clientId, else retrieve all.
    return $resource('http://localhost:port/clients/:clientId', {port: ':3001', clientId: '@clientId'}, {

    });
});

另外,我通过比较id解决了这个问题:

it('should preselect first client in array', function () {
    expect(scope.selected.client.id).toEqual(RESPONSE[0].id);
});
trans by 2020-07-28T06:03:25Z

茉莉花-描述和笑话之间有什么区别?

用jest或jasmine编写单元测试时,何时使用describe()? 什么时候使用它()?

我通常会

describe('App Name', function () {
    it('test ....', function () {
    })'
})

什么时候来新的describe()? 还是新的it()?

trans by 2020-07-19T03:24:16Z

javascript-如何使用茉莉花监视吸气剂属性?

如何使用茉莉花监视吸气剂属性?

var o = { get foo() {}, };

spyOn(o, 'foo').and.returnValue('bar'); // Doesn't work.

这在AFAICT中也不起作用:

spyOn(Object.getOwnPropertyDescriptor(o, 'foo'), 'get').and.returnValue('bar');
trans by 2020-07-11T20:29:17Z

javascript-为什么嵌套的describe()块看不到外部块中定义的var?

我已经在实际代码中遇到了这个问题,但是我整理了一个简单的例子来证明这一点。

下面的代码工作正常。 我在根beforeEach()块中设置了一个变量,该变量可在sub-apply()s的call()块中访问。

describe('simple object', function () {
    var orchard;

    beforeEach(function () {
        orchard = {
            trees: {
                apple: 10,
                orange : 20
            },
            bushes: {
                boysenberry : 40,
                blueberry: 35
            }
        };
    });

    describe('trees', function () {
        it ('should have apples and oranges', function() {
            var trees = orchard.trees;

            expect (trees.apple).toBeDefined();
            expect (trees.orange).toBeDefined();

            expect (trees.apple).toEqual(10);
            expect (trees.orange).toEqual(20);
        });
        it ('should NOT have pears or cherries', function() {
            var trees = orchard.trees;

            expect (trees.pear).toBeUndefined();
            expect (trees.cherry).toBeUndefined();
        });
    });
});

[HTTP://JS fiddle.net/我5班主任考核9/]

但是,如果我尝试通过执行以下操作来稍微干燥我的代码,则会中断:

describe('simple object', function () {
    var orchard;

    beforeEach(function () {
        orchard = {
            trees: {
                apple: 10,
                orange : 20
            },
            bushes: {
                boysenberry : 40,
                blueberry: 35
            }
        };
    });

    describe('trees', function () {
        var trees = orchard.trees; // TypeError: Cannot read property 'trees' of undefined

        it ('should have apples and oranges', function() {
            expect (trees.apple).toBeDefined();
            expect (trees.orange).toBeDefined();

            expect (trees.apple).toEqual(10);
            expect (trees.orange).toEqual(20);
        });
        it ('should NOT have pears or cherries', function() {
            expect (trees.pear).toBeUndefined();
            expect (trees.cherry).toBeUndefined();
        });
    });
});

[HTTP://JS fiddle.net/go全场EV42/]

在嵌套beforeEach()范围内,即使在call()块中定义的apply()对象也未定义。

Jasmine的开发人员是否有意这样做,可能是为了避免在beforeEach()中重置对象并可能破坏某些参考的问题? 他们如何实现的? 我可以看到这可能有用,我只是很好奇它的工作原理。 (我的猜测是一些apply()call()魔术,但我不确定如何...)

--

作为一个旁注,我仍然可以通过简单地使用另一个beforeEach()块来烘干我的代码:

describe('simple object', function () {
    var orchard;

    beforeEach(function () {
        orchard = {
            trees: {
                apple: 10,
                orange : 20
            },
            bushes: {
                boysenberry : 40,
                blueberry: 35
            }
        };
    });

    describe('trees', function () {
        var trees;

        beforeEach(function() {
            trees = orchard.trees;
        });

        it ('should have apples and oranges', function() {
            expect (trees.apple).toBeDefined();
            expect (trees.orange).toBeDefined();

            expect (trees.apple).toEqual(10);
            expect (trees.orange).toEqual(20);
        });
        it ('should NOT have pears or cherries', function() {
            expect (trees.pear).toBeUndefined();
            expect (trees.cherry).toBeUndefined();
        });
    });
});
trans by 2020-07-03T05:21:06Z

如何从命令行在Node.js上运行Jasmine测试

如何从命令行在Node.js上运行Jasmine测试? 我已经通过npm安装了jasmine-node并编写了一些测试。 我想在spec目录中运行测试并在终端中获取结果,这可能吗?

trans by 2020-06-25T00:26:51Z

javascript-如何在Directi的链接功能中测试行为

在我的某些指令中,我正在向作用域添加函数以处理特定于该指令的逻辑。 例如:

link: function(scope, element, attrs) {
         scope.doStuff = function() {
            //do a bunch of stuff I want to test
         }        
      }

我该如何测试该功能? 我四处搜寻有关如何测试指令的信息,但发现的更多内容是测试元素上的更改。 我当然可以在每次测试之前编译指令,但是每次都会覆盖我的范围。 我想在我的范围更改属性时测试该功能。

有什么方法可以保留从指令定义返回的对象吗? 然后,我可以直接调用链接函数并测试作用域上定义的每个函数的行为。 有没有更好的方法来完成所有这些工作?

我正在使用Jasmine来运行测试,并且想要在describe函数中进行示波器设置,因此对于相同的示波器数据,我可以具有多个it函数。

trans by 2020-06-23T00:35:43Z

茉莉花-在Angular 2中对可观察对象进行单元测试

在Angular 2中对返回可观察结果的服务进行单元测试的正确方法是什么? 假设我们在CarService服务类中有一个getCars方法:

...
export class CarService{
    ...
    getCars():Observable<any>{
        return this.http.get("http://someurl/cars").map( res => res.json() );
    }
    ...
}

如果我尝试通过以下方式编写测试,则会收到警告:“ SPEC没有期望”:

it('retrieves all the cars', inject( [CarService], ( carService ) => {
     carService.getCars().subscribe( result => {         
         expect(result.length).toBeGreaterThan(0);
     } );       
}) );

据我所知,使用injectAsync没有帮助,因为它可以与Promise对象一起使用。

trans by 2020-06-22T21:18:13Z

当没有$ scope强制摘要时,如何在AngularJS,Jasmine 2.0中解决Promise?

除非您强制使用$scope.$digest(),否则在Angular / Jasmine测试中,诺言似乎无法解决。这是一个愚蠢的IMO,但可以,我在适用的情况下(控制器)正常工作。

我现在所处的情况是我有一项服务,该服务可能不太在乎应用程序中的任何作用域,它所做的只是从服务器返回一些数据,但诺言似乎无法解决。

app.service('myService', function($q) {
  return {
    getSomething: function() {
      var deferred = $q.defer();
      deferred.resolve('test');
      return deferred.promise;
    }
  }
});

describe('Method: getSomething', function() {
  // In this case the expect()s are never executed
  it('should get something', function(done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
      expect(1).toEqual(2);
    });

    done();
  });

  // This throws an error because done() is never called.
  // Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
  it('should get something', function(done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
      expect(1).toEqual(2);
      done();
    });
  });
});

测试此功能的正确方法是什么?

编辑:解决方案以供参考。 显然,即使服务未使用$ rootScope,您也不得不注入并消化该$ rootScope。

  it('should get something', function($rootScope, done) {
    var promise = myService.getSomething();

    promise.then(function(resp) {
      expect(resp).toBe('test');      
    });

    $rootScope.$digest();
    done();
  }); 
trans by 2020-06-21T10:29:40Z

Javascript-一个存根如何与sinon约定?

我有一个具有以下功能的数据服务

function getInsureds(searchCriteria) {

    var deferred = $q.defer();

    insuredsSearch.get(searchCriteria,
        function (insureds) {
            deferred.resolve(insureds);
        },
        function (response) {
            deferred.reject(response);
        });

    return deferred.promise;
}

我想测试以下功能:

function search ()
{
  dataService
      .getInsureds(vm.searchCriteria)
      .then(function (response) {
           vm.searchCompleted = true;

            if (response.insureds.length > 100) {
              vm.searchResults = response.insureds.slice(0, 99);
            } else {
                vm.searchResults = response.insureds;
           }
       });
}

我将如何兑现承诺,以便在我致电getInsureds时能够解决承诺并立即将结果返回给我。 我是这样开始的(茉莉花测试),但由于我不知道如何解决承诺并传递所需的参数,所以我陷入了困境。

it("search returns over 100 results searchResults should contain only 100 records ", function () {

    var results103 = new Array();

    for (var i = 0; i < 103; i++) {
        results103.push(i);
    }

    var fakeSearchForm = { $valid: true };
    var isSearchValidStub = sinon.stub(sut, "isSearchCriteriaValid").returns(true);

    var deferred = $q.defer();
    var promise = deferred.promise;
    var dsStub = sinon.stub(inSearchDataSvc, "getInsureds").returns(promise);

    var resolveStub = sinon.stub(deferred, "resolve");

    //how do i call resolve  and pass in results103

    sut.performSearch(fakeSearchForm);

    sinon.assert.calledOnce(isSearchValidStub);
    sinon.assert.calledOnce(dsStub);

    sinon.assert.called(resolveStub);

    expect(sut.searchResults.length).toBe(100);

});
trans by 2020-06-19T20:30:53Z

angularjs-需要控制器的测试指令

因此,我确实看到了另一个问题:如何在指令UT中模拟所需的指令控制器,这基本上是我的问题,但似乎该线程的答案是“更改设计”。 我想确保没有办法做到这一点。 我有一条指令声明了子指令使用的控制器。 我现在正尝试为children指令编写茉莉花测试,但由于它们依赖于控制器,因此我无法让它们在测试中进行编译。 看起来像这样:

addressModule.directive('address', ['$http', function($http){
        return {
            replace: false,
            restrict: 'A',
            scope: {
                config: '='
            },
            template:   '<div id="addressContainer">' +
                            '<div ng-if="!showAddressSelectionPage" basic-address config="config"/>' +
                            '<div ng-if="showAddressSelectionPage" address-selector addresses="standardizedAddresses"/>' +
                        '</div>',
            controller: function($scope)
            {
                this.showAddressInput = function(){
                    $scope.showAddressSelectionPage = false;
                };

                this.showAddressSelection = function(){
                    $scope.getStandardizedAddresses();
                };

                this.finish = function(){
                    $scope.finishAddress();
                };
            },
            link: function(scope, element, attrs) {
              ...
            }
       }
}])

子指令:

addressModule.directive('basicAddress360', ['translationService', function(translationService){
        return {
            replace: true,
            restrict: 'A',
            scope: {
                config: '='
            },
            template:
                '...',
            require: "^address360",
            link: function(scope, element, attrs, addressController){
            ...
            }
       }
}])

茉莉花测试:

it("should do something", inject(function($compile, $rootScope){
            parentHtml = '<div address/>';
            subDirectiveHtml = '<div basic-address>';

            parentElement = $compile(parentHtml)(rootScope);
            parentScope = parentElement.scope();
            directiveElement = $compile(subDirectiveHtml)(parentScope);
            directiveScope = directiveElement.scope();
            $rootScope.$digest();
}));

我没有办法用茉莉花测试子指令,如果可以,我会缺少什么? 即使我可以在没有控制器功能的情况下测试指令本身,我也会很高兴。

trans by 2020-06-19T01:36:08Z

打字稿-Angu中的单元测试click事件

我正在尝试将单元测试添加到Angular 2应用程序中。 在我的组件之一中,有一个带有onEditButtonClick处理程序的按钮。 当用户单击按钮时,将调用一个函数,该函数在onEditButtonClick类文件中定义。 该函数在console.log窗口中打印一条消息,表明已按下该按钮。 我当前的测试代码测试了console.log消息的打印:

describe('Component: ComponentToBeTested', () => {
    var component: ComponentToBeTested;

    beforeEach(() => {
        component = new ComponentToBeTested();
        spyOn(console, 'log');
    });

    it('should call onEditButtonClick() and print console.log', () => {
        component.onEditButtonClick();
        expect(console.log).toHaveBeenCalledWith('Edit button has been clicked!);
    });
});

但是,这仅测试控制器类,而不测试HTML。 我不只是要测试在调用onEditButtonClick时是否发生了日志记录; 我还想测试用户单击组件的HTML文件中定义的编辑按钮时是否调用了onEditButtonClick。 我怎样才能做到这一点?

trans by 2020-02-05T23:36:07Z

javascript-使用Jasmine进行角单元测试:如何删除或修改spyOn

AngularJS v1.2.26

茉莉花v2.2.0

如何更改或删除spyOn的行为? 当我尝试覆盖它时,出现以下错误:Error: getUpdate has already been spied upon

var data1 = 'foo';
var data2 = 'bar';

describe("a spec with a spy", function(){

    beforeEach(module('app'));

    var $q;

    beforeEach(inject(function(_updateService_, _$q_){
        updateService = _updateService_;

        //spy the results of the getUpdate()
        $q = _$q_;
        var deferred = $q.defer();
        deferred.resolve( data1 );
        spyOn(updateService, 'getUpdate').and.returnValue(deferred.promise);

    }));

    describe('and here the spy should be different', function() {

        it('returns a different value', function() {

          var deferred = $q.defer();
          deferred.resolve( data2 );
          spyOn(updateService, 'getUpdate'); //ERROR HERE
          updateService.getUpdate.and.returnValue(deferred.promise);

          ...

        });
    });

...

当我删除第二个spyOn时,测试不起作用。

我该怎么做呢?

trans by 2020-02-02T22:05:43Z

javascript-在Expect()上显示消息断言失败

当Jasmine expect()失败时,有没有办法打印自定义错误消息?

例如,对于端到端测试,我有一组网页,并使用一个测试转到每个URL,并断言每个页面上都存在一个元素。 我知道我可以将每个expect()放入单独的测试中,但是我宁愿遍历数组并在失败时记录页面URL。

trans by 2020-01-27T06:59:31Z

为什么我的AngularJS,Karma / Jasmine测试运行如此缓慢?

我有一些针对angularjs应用运行的简单的业力/茉莉单元测试。 我使用最新版本的Chrome,并在WebStorm IDE中运行测试。

有时测试套件运行非常快(0.24秒)

有时,针对完全相同的代码的完全相同的测试套件运行非常缓慢(120秒)

我已经尝试了所有常识性修复。 我在网上搜寻了一下,以发现我在做什么错。

为什么我的测试运行如此缓慢?

trans by 2020-01-26T16:19:19Z

javascript-在单元测试AngularJS服务时注入依赖服务

我正在测试服务A,但服务A取决于服务B(即服务B已注入服务A)。

我已经看到了这个问题,但是我的情况有所不同,因为我认为模拟服务B而不是注入服务B的实际实例更有意义。我将用茉莉间谍对其进行模拟。

这是一个示例测试:

describe("Sample Test Suite", function() {

  beforeEach(function() {

    module('moduleThatContainsServiceA');

    inject([
      'serviceA', function(service) {
        this.service = service;
      }
    ]);

  });

  it('can create an instance of the service', function() {
    expect(this.service).toBeDefined();
  });
});

我得到的错误是:

错误:未知提供程序:serviceBProvider

我该怎么做?

trans by 2020-01-22T20:36:30Z

javascript-强制失败Jasmine tes

如果我在测试中有永远不应该到达的代码(例如,promise序列的expect(true).toBe(false);子句),如何强制测试失败?

我使用2790915011158180864之类的东西,但这并不漂亮。

另一种选择是等待测试超时,这是我想避免的(因为它很慢)。

trans by 2020-01-18T10:07:06Z

angular-使用@Input()进行Angular2单元测试

我有一个在实例变量上使用openProductPage()批注的组件,我正在尝试为openProductPage()方法编写单元测试,但是我对设置单元测试的方式有些迷惑。 我可以将该实例变量设置为公共变量,但我认为我不必诉诸于此。

如何设置茉莉花测试,以便注射(提供?)模拟产品,并且可以测试openProductPage()方法?

我的组件:

import {Component, Input} from "angular2/core";
import {Router} from "angular2/router";

import {Product} from "../models/Product";

@Component({
    selector: "product-thumbnail",
    templateUrl: "app/components/product-thumbnail/product-thumbnail.html"
})

export class ProductThumbnail {
    @Input() private product: Product;


    constructor(private router: Router) {
    }

    public openProductPage() {
        let id: string = this.product.id;
        this.router.navigate([“ProductPage”, {id: id}]);
    }
}
trans by 2020-01-17T15:41:27Z

1 2 3 4 下一页 共4页